diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml index 0e5fa98d1..f33877130 100644 --- a/.github/workflows/nodejs.yml +++ b/.github/workflows/nodejs.yml @@ -8,7 +8,7 @@ jobs: strategy: matrix: - node-version: [18.x, 20.x] + node-version: [20.x, 24.x] services: postgres: diff --git a/.mocharc.json b/.mocharc.json index afb61cb4d..a8cd6cb47 100644 --- a/.mocharc.json +++ b/.mocharc.json @@ -1,7 +1,8 @@ { - "timeout": 30000, - "require": ["ts-node/register", "source-map-support/register"], + "timeout": 60000, + "require": ["source-map-support/register"], "reporter": "Dot", "extension": ".test.ts", - "exit": true + "exit": true, + "loader": "ts-node/esm" } diff --git a/LICENSE b/LICENSE index 7712f870f..f9b502c69 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2024 Feathers Contributors +Copyright (c) 2025 Feathers Contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -19,4 +19,3 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - diff --git a/README.md b/README.md index 1f6cebbde..de672c010 100644 --- a/README.md +++ b/README.md @@ -48,6 +48,6 @@ npm test # License -Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) +Copyright (c) 2025 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) Licensed under the [MIT license](LICENSE). diff --git a/docs/api/schema/typebox.md b/docs/api/schema/typebox.md index 1396a5e3d..3360afe4e 100644 --- a/docs/api/schema/typebox.md +++ b/docs/api/schema/typebox.md @@ -1460,11 +1460,11 @@ In addition to JSON schema types, TypeBox provides several extended types that a #### Extended Configuration -Utilities in this section require updating `src/schemas/validators.ts` to the Extended Ajv Configuration, as shown here: +Utilities in this section require updating `src/schemas/validators.ts` to the Extended Ajv Configuration, as shown here: ```ts -import { TypeGuard } from '@sinclair/typebox' -import { Value } from '@sinclair/typebox/value' +import { TypeGuard } from 'typebox' +import { Value } from 'typebox/value' import addFormats from 'ajv-formats' import type { Options } from 'ajv' import Ajv from 'ajv' diff --git a/docs/package.json b/docs/package.json index 7f86eb045..98b884df6 100644 --- a/docs/package.json +++ b/docs/package.json @@ -19,7 +19,7 @@ "vue": "^3.5.21" }, "devDependencies": { - "@feathersjs/generators": "^5.0.34", + "@feathersjs/generators": "^5.0.35", "@iconify-json/carbon": "^1.2.13", "@types/node": "^24.3.1", "@unocss/preset-typography": "^66.5.1", diff --git a/generators/package.ts b/generators/package.ts deleted file mode 100644 index 1d351338a..000000000 --- a/generators/package.ts +++ /dev/null @@ -1,43 +0,0 @@ -import type { Callable, PinionContext } from '@featherscloud/pinion' -import { generator, install, prompt, runGenerators, toFile } from '@featherscloud/pinion' - -export interface ModuleContext extends PinionContext { - name: string - uppername: string - description: string - moduleName: string - packagePath: Callable -} - -export const generate = (context: ModuleContext) => - generator(context) - .then( - prompt([ - { - type: 'input', - name: 'name', - message: 'What is the name of the module?' - }, - { - type: 'input', - name: 'description', - message: 'Write a short description' - } - ]) - ) - .then((ctx) => { - return { - ...ctx, - moduleName: `@feathersjs/${ctx.name}`, - uppername: ctx.name.charAt(0).toUpperCase() + ctx.name.slice(1), - packagePath: toFile('packages', ctx.name) - } - }) - .then(runGenerators(__dirname, 'package')) - .then( - install( - ['@types/node', 'shx', 'ts-node', 'typescript', 'mocha'], - true, - (context) => `npm --workspace packages/${context.name}` - ) - ) diff --git a/generators/package/index.tpl.ts b/generators/package/index.tpl.ts deleted file mode 100644 index 06b063adc..000000000 --- a/generators/package/index.tpl.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { generator, renderTemplate, toFile } from '@featherscloud/pinion' -import { ModuleContext } from '../package' - -interface Context extends ModuleContext {} - -const template = ({ name }: Context) => ` -export function ${name}() { - return 'Hello from ${name}' -} -` - -export const generate = (context: Context) => - generator(context).then(renderTemplate(template, toFile(context.packagePath, 'src', 'index.ts'))) diff --git a/generators/package/package.json.tpl.ts b/generators/package/package.json.tpl.ts deleted file mode 100644 index 1a27515ae..000000000 --- a/generators/package/package.json.tpl.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { generator, toFile, writeJSON } from '@featherscloud/pinion' -import { ModuleContext } from '../package' - -interface Context extends ModuleContext {} - -export const generate = (context: Context) => - generator(context).then( - writeJSON( - ({ moduleName, description, name }) => ({ - name: moduleName, - description, - version: '0.0.0', - homepage: 'https://feathersjs.com', - keywords: ['feathers'], - license: 'MIT', - repository: { - type: 'git', - url: 'git://github.com/feathersjs/feathers.git', - directory: `packages/${name}` - }, - author: { - name: 'Feathers contributor', - email: 'hello@feathersjs.com', - url: 'https://feathersjs.com' - }, - contributors: [], - bugs: { - url: 'https://github.com/feathersjs/feathers/issues' - }, - engines: { - node: '>= 20' - }, - files: ['CHANGELOG.md', 'LICENSE', 'README.md', 'src/**', 'lib/**', 'esm/**'], - // module: './esm/index.js', - main: './lib/index.js', - types: './src/index.ts', - exports: { - '.': { - // import: './esm/index.js', - require: './lib/index.js', - types: './src/index.ts' - } - }, - scripts: { - prepublish: 'npm run compile', - pack: 'npm pack --pack-destination ../generators/test/build', - compile: 'shx rm -rf lib/ && tsc && npm run pack', - test: 'mocha --config ../../.mocharc.json --recursive test/**.test.ts test/**/*.test.ts' - }, - publishConfig: { - access: 'public' - }, - dependencies: {}, - devDependencies: {} - }), - toFile('packages', context.name, 'package.json') - ) - ) diff --git a/generators/package/readme.md.tpl.ts b/generators/package/readme.md.tpl.ts deleted file mode 100644 index f4495d275..000000000 --- a/generators/package/readme.md.tpl.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { generator, renderTemplate, toFile } from '@featherscloud/pinion' -import { ModuleContext } from '../package' - -const template = ({ description, moduleName }: ModuleContext) => `# ${moduleName} - -[![CI](https://github.com/feathersjs/feathers/workflows/CI/badge.svg)](https://github.com/feathersjs/feathers/actions?query=workflow%3ACI) -[![Download Status](https://img.shields.io/npm/dm/${moduleName}.svg?style=flat-square)](https://www.npmjs.com/package/${moduleName}) -[![Discord](https://badgen.net/badge/icon/discord?icon=discord&label)](https://discord.gg/qa8kez8QBx) - -> ${description} - -## Installation - -\`\`\` -npm install ${moduleName} --save -\`\`\` - -## Documentation - -Refer to the [Feathers API documentation](https://feathersjs.com/api) for more details. - -## License - -Copyright (c) ${new Date().getFullYear()} [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) - -Licensed under the [MIT license](LICENSE). -` - -export const generate = (context: ModuleContext) => - generator(context).then(renderTemplate(template, toFile(context.packagePath, 'README.md'))) diff --git a/generators/package/test.tpl.ts b/generators/package/test.tpl.ts deleted file mode 100644 index 25f5b7d46..000000000 --- a/generators/package/test.tpl.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { generator, renderTemplate, toFile } from '@featherscloud/pinion' -import { ModuleContext } from '../package' - -interface Context extends ModuleContext {} - -const template = ({ moduleName, name }: Context) => /** ts */ `import { strict as assert } from 'assert' -import { ${name} } from '../src/index' - -describe('${moduleName}', () => { - it('initializes', () => { - assert.equal(${name}(), 'Hello from ${name}') - }) -}) -` - -export const generate = (context: Context) => - generator(context).then( - renderTemplate(template, toFile(context.packagePath, 'test', 'index.test.ts')) - ) diff --git a/generators/package/tsconfig.json.tpl.ts b/generators/package/tsconfig.json.tpl.ts deleted file mode 100644 index 875f9f490..000000000 --- a/generators/package/tsconfig.json.tpl.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { generator, toFile, writeJSON } from '@featherscloud/pinion' -import { ModuleContext } from '../package' - -export const generate = (context: ModuleContext) => - generator(context).then( - writeJSON( - { - extends: '../../tsconfig', - include: ['src/**/*.ts'], - compilerOptions: { - outDir: 'lib' - } - }, - toFile(context.packagePath, 'tsconfig.json') - ) - ) diff --git a/package-lock.json b/package-lock.json index 9bd99b4d4..4fd8f710f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,6 +19,7 @@ "eslint-config-prettier": "^9.1.0", "eslint-plugin-prettier": "^5.1.3", "lerna": "^8.1.2", + "lodash": "^4.17.21", "npm-check-updates": "^16.14.20", "prettier": "^3.2.5", "typescript": "^5.4.5" @@ -41,7 +42,7 @@ "vue": "^3.5.21" }, "devDependencies": { - "@feathersjs/generators": "^5.0.34", + "@feathersjs/generators": "^5.0.35", "@iconify-json/carbon": "^1.2.13", "@types/node": "^24.3.1", "@unocss/preset-typography": "^66.5.1", @@ -66,16 +67,16 @@ } }, "node_modules/@algolia/abtesting": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.3.0.tgz", - "integrity": "sha512-KqPVLdVNfoJzX5BKNGM9bsW8saHeyax8kmPFXul5gejrSPN3qss7PgsFH5mMem7oR8tvjvNkia97ljEYPYCN8Q==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.4.0.tgz", + "integrity": "sha512-N0blWT/C0KOZ/OJ9GXBX66odJZlrYjMj3M+01y8ob1mjBFnBaBo7gOCyHBDQy60+H4pJXp3pSGlJOqJIueBH+A==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.37.0", - "@algolia/requester-browser-xhr": "5.37.0", - "@algolia/requester-fetch": "5.37.0", - "@algolia/requester-node-http": "5.37.0" + "@algolia/client-common": "5.38.0", + "@algolia/requester-browser-xhr": "5.38.0", + "@algolia/requester-fetch": "5.38.0", + "@algolia/requester-node-http": "5.38.0" }, "engines": { "node": ">= 14.0.0" @@ -131,41 +132,41 @@ } }, "node_modules/@algolia/client-abtesting": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.37.0.tgz", - "integrity": "sha512-Dp2Zq+x9qQFnuiQhVe91EeaaPxWBhzwQ6QnznZQnH9C1/ei3dvtmAFfFeaTxM6FzfJXDLvVnaQagTYFTQz3R5g==", + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.38.0.tgz", + "integrity": "sha512-15d6zv8vtj2l9pnnp/EH7Rhq3/snCCHRz56NnX6xIUPrbJl5gCsIYXAz8C2IEkwOpoDb0r5G6ArY2gKdVMNezw==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.37.0", - "@algolia/requester-browser-xhr": "5.37.0", - "@algolia/requester-fetch": "5.37.0", - "@algolia/requester-node-http": "5.37.0" + "@algolia/client-common": "5.38.0", + "@algolia/requester-browser-xhr": "5.38.0", + "@algolia/requester-fetch": "5.38.0", + "@algolia/requester-node-http": "5.38.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-analytics": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.37.0.tgz", - "integrity": "sha512-wyXODDOluKogTuZxRII6mtqhAq4+qUR3zIUJEKTiHLe8HMZFxfUEI4NO2qSu04noXZHbv/sRVdQQqzKh12SZuQ==", + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.38.0.tgz", + "integrity": "sha512-jJIbYAhYvTG3+gEAP5Q5Dp6PFJfUR+atz5rsqm5KjAKK+faLFdHJbM2IbOo0xdyGd+SH259MzfQKLJ9mZZ27dQ==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.37.0", - "@algolia/requester-browser-xhr": "5.37.0", - "@algolia/requester-fetch": "5.37.0", - "@algolia/requester-node-http": "5.37.0" + "@algolia/client-common": "5.38.0", + "@algolia/requester-browser-xhr": "5.38.0", + "@algolia/requester-fetch": "5.38.0", + "@algolia/requester-node-http": "5.38.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-common": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.37.0.tgz", - "integrity": "sha512-GylIFlPvLy9OMgFG8JkonIagv3zF+Dx3H401Uo2KpmfMVBBJiGfAb9oYfXtplpRMZnZPxF5FnkWaI/NpVJMC+g==", + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.38.0.tgz", + "integrity": "sha512-aMCXzVPGJTeQnVU3Sdf30TfMN2+QyWcjfPTCCHyqVVgjPipb6RnK40aISGoO+rlYjh9LunDsNVFLwv+JEIF8bQ==", "dev": true, "license": "MIT", "engines": { @@ -173,151 +174,151 @@ } }, "node_modules/@algolia/client-insights": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.37.0.tgz", - "integrity": "sha512-T63afO2O69XHKw2+F7mfRoIbmXWGzgpZxgOFAdP3fR4laid7pWBt20P4eJ+Zn23wXS5kC9P2K7Bo3+rVjqnYiw==", + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.38.0.tgz", + "integrity": "sha512-4c3FbpMiJX+VcaAj0rYaQdTLS/CkrdOn4hW+5y1plPov7KC7iSHai/VBbirmHuAfW1hVPCIh1w/4erKKTKuo+Q==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.37.0", - "@algolia/requester-browser-xhr": "5.37.0", - "@algolia/requester-fetch": "5.37.0", - "@algolia/requester-node-http": "5.37.0" + "@algolia/client-common": "5.38.0", + "@algolia/requester-browser-xhr": "5.38.0", + "@algolia/requester-fetch": "5.38.0", + "@algolia/requester-node-http": "5.38.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-personalization": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.37.0.tgz", - "integrity": "sha512-1zOIXM98O9zD8bYDCJiUJRC/qNUydGHK/zRK+WbLXrW1SqLFRXECsKZa5KoG166+o5q5upk96qguOtE8FTXDWQ==", + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.38.0.tgz", + "integrity": "sha512-FzLs6c8TBL4FSgNfnH2NL7O33ktecGiaKO4ZFG51QYORUzD5d6YwB9UBteaIYu/sgFoEdY57diYU4vyBH8R6iA==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.37.0", - "@algolia/requester-browser-xhr": "5.37.0", - "@algolia/requester-fetch": "5.37.0", - "@algolia/requester-node-http": "5.37.0" + "@algolia/client-common": "5.38.0", + "@algolia/requester-browser-xhr": "5.38.0", + "@algolia/requester-fetch": "5.38.0", + "@algolia/requester-node-http": "5.38.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-query-suggestions": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.37.0.tgz", - "integrity": "sha512-31Nr2xOLBCYVal+OMZn1rp1H4lPs1914Tfr3a34wU/nsWJ+TB3vWjfkUUuuYhWoWBEArwuRzt3YNLn0F/KRVkg==", + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.38.0.tgz", + "integrity": "sha512-7apiahlgZLvOqrh0+hAYAp/UWjqz6AfSJrCwnsoQNzgIT09dLSPIKREelkuQeUrKy38vHWWpSQE3M0zWSp/YrA==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.37.0", - "@algolia/requester-browser-xhr": "5.37.0", - "@algolia/requester-fetch": "5.37.0", - "@algolia/requester-node-http": "5.37.0" + "@algolia/client-common": "5.38.0", + "@algolia/requester-browser-xhr": "5.38.0", + "@algolia/requester-fetch": "5.38.0", + "@algolia/requester-node-http": "5.38.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-search": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.37.0.tgz", - "integrity": "sha512-DAFVUvEg+u7jUs6BZiVz9zdaUebYULPiQ4LM2R4n8Nujzyj7BZzGr2DCd85ip4p/cx7nAZWKM8pLcGtkTRTdsg==", + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.38.0.tgz", + "integrity": "sha512-PTAFMJOpVtJweExEYYgdmSCC6n4V/R+ctDL3fRQy77ulZM/p+zMLIQC9c7HCQE1zqpauvVck3f2zYSejaUTtrw==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.37.0", - "@algolia/requester-browser-xhr": "5.37.0", - "@algolia/requester-fetch": "5.37.0", - "@algolia/requester-node-http": "5.37.0" + "@algolia/client-common": "5.38.0", + "@algolia/requester-browser-xhr": "5.38.0", + "@algolia/requester-fetch": "5.38.0", + "@algolia/requester-node-http": "5.38.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/ingestion": { - "version": "1.37.0", - "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.37.0.tgz", - "integrity": "sha512-pkCepBRRdcdd7dTLbFddnu886NyyxmhgqiRcHHaDunvX03Ij4WzvouWrQq7B7iYBjkMQrLS8wQqSP0REfA4W8g==", + "version": "1.38.0", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.38.0.tgz", + "integrity": "sha512-qGSUGgceJHGyJLZ06bFLwVe2Tpf9KwabmoBjFvFscVmMmU5scKya6voCYd9bdX7V0Xy1qya9MGbmTm4zlLuveQ==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.37.0", - "@algolia/requester-browser-xhr": "5.37.0", - "@algolia/requester-fetch": "5.37.0", - "@algolia/requester-node-http": "5.37.0" + "@algolia/client-common": "5.38.0", + "@algolia/requester-browser-xhr": "5.38.0", + "@algolia/requester-fetch": "5.38.0", + "@algolia/requester-node-http": "5.38.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/monitoring": { - "version": "1.37.0", - "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.37.0.tgz", - "integrity": "sha512-fNw7pVdyZAAQQCJf1cc/ih4fwrRdQSgKwgor4gchsI/Q/ss9inmC6bl/69jvoRSzgZS9BX4elwHKdo0EfTli3w==", + "version": "1.38.0", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.38.0.tgz", + "integrity": "sha512-VnCtAUcHirvv/dDHg9jK1Z5oo4QOC5FKDxe40x8qloru2qDcjueT34jiAsB0gRos3VWf9v4iPSYTqMIFOcADpQ==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.37.0", - "@algolia/requester-browser-xhr": "5.37.0", - "@algolia/requester-fetch": "5.37.0", - "@algolia/requester-node-http": "5.37.0" + "@algolia/client-common": "5.38.0", + "@algolia/requester-browser-xhr": "5.38.0", + "@algolia/requester-fetch": "5.38.0", + "@algolia/requester-node-http": "5.38.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/recommend": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.37.0.tgz", - "integrity": "sha512-U+FL5gzN2ldx3TYfQO5OAta2TBuIdabEdFwD5UVfWPsZE5nvOKkc/6BBqP54Z/adW/34c5ZrvvZhlhNTZujJXQ==", + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.38.0.tgz", + "integrity": "sha512-fqgeU9GqxQorFUeGP4et1MyY28ccf9PCeciHwDPSbPYYiTqBItHdUIiytsNpjC5Dnc0RWtuXWCltLwSw9wN/bQ==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.37.0", - "@algolia/requester-browser-xhr": "5.37.0", - "@algolia/requester-fetch": "5.37.0", - "@algolia/requester-node-http": "5.37.0" + "@algolia/client-common": "5.38.0", + "@algolia/requester-browser-xhr": "5.38.0", + "@algolia/requester-fetch": "5.38.0", + "@algolia/requester-node-http": "5.38.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-browser-xhr": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.37.0.tgz", - "integrity": "sha512-Ao8GZo8WgWFABrU7iq+JAftXV0t+UcOtCDL4mzHHZ+rQeTTf1TZssr4d0vIuoqkVNnKt9iyZ7T4lQff4ydcTrw==", + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.38.0.tgz", + "integrity": "sha512-nAUKbv4YQIXbpPi02AQvSPisD5FDDbT8XeYSh9HFoYP0Z3IpBLLDg7R4ahPvzd7gGsVKgEbXzRPWESXSji5yIg==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.37.0" + "@algolia/client-common": "5.38.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-fetch": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.37.0.tgz", - "integrity": "sha512-H7OJOXrFg5dLcGJ22uxx8eiFId0aB9b0UBhoOi4SMSuDBe6vjJJ/LeZyY25zPaSvkXNBN3vAM+ad6M0h6ha3AA==", + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.38.0.tgz", + "integrity": "sha512-bkuAHaadC6OxJd3SVyQQnU1oJ9G/zdCqua7fwr1tJDrA/v7KzeS5np4/m6BuRUpTgVgFZHSewGnMcgj9DLBoaQ==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.37.0" + "@algolia/client-common": "5.38.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-node-http": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.37.0.tgz", - "integrity": "sha512-npZ9aeag4SGTx677eqPL3rkSPlQrnzx/8wNrl1P7GpWq9w/eTmRbOq+wKrJ2r78idlY0MMgmY/mld2tq6dc44g==", + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.38.0.tgz", + "integrity": "sha512-yHDKZTnMPR3/4bY0CVC1/uRnnbAaJ+pctRuX7G/HflBkKOrnUBDEGtQQHzEfMz2FHZ/tbCL+Q9r6mvwTSGp8nw==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.37.0" + "@algolia/client-common": "5.38.0" }, "engines": { "node": ">= 14.0.0" @@ -338,9 +339,9 @@ } }, "node_modules/@antfu/utils": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-9.2.0.tgz", - "integrity": "sha512-Oq1d9BGZakE/FyoEtcNeSwM7MpDO2vUBi11RWBZXf75zPsbUVWmUs03EqkRFrcgbXyKTas0BdZWC1wcuSoqSAw==", + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-9.2.1.tgz", + "integrity": "sha512-TMilPqXyii1AsiEii6l6ubRzbo76p6oshUSYPaKsmXDavyMLqjzVDkcp3pHp5ELMUNJHATcEOGxKTTsX9yYhGg==", "dev": true, "license": "MIT", "funding": { @@ -348,16 +349,16 @@ } }, "node_modules/@azure-rest/core-client": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@azure-rest/core-client/-/core-client-2.5.0.tgz", - "integrity": "sha512-KMVIPxG6ygcQ1M2hKHahF7eddKejYsWTjoLIfTWiqnaj42dBkYzj4+S8rK9xxmlOaEHKZHcMrRbm0NfN4kgwHw==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@azure-rest/core-client/-/core-client-2.5.1.tgz", + "integrity": "sha512-EHaOXW0RYDKS5CFffnixdyRPak5ytiCtU7uXDcP/uiY+A6jFRwNGzzJBiznkCzvi5EYpY+YWinieqHb0oY916A==", "dev": true, "license": "MIT", "dependencies": { - "@azure/abort-controller": "^2.0.0", - "@azure/core-auth": "^1.9.0", - "@azure/core-rest-pipeline": "^1.5.0", - "@azure/core-tracing": "^1.0.1", + "@azure/abort-controller": "^2.1.2", + "@azure/core-auth": "^1.10.0", + "@azure/core-rest-pipeline": "^1.22.0", + "@azure/core-tracing": "^1.3.0", "@typespec/ts-http-runtime": "^0.3.0", "tslib": "^2.6.2" }, @@ -379,14 +380,14 @@ } }, "node_modules/@azure/core-auth": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.10.0.tgz", - "integrity": "sha512-88Djs5vBvGbHQHf5ZZcaoNHo6Y8BKZkt3cw2iuJIQzLEgH4Ox6Tm4hjFhbqOxyYsgIG/eJbFEHpxRIfEEWv5Ow==", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.10.1.tgz", + "integrity": "sha512-ykRMW8PjVAn+RS6ww5cmK9U2CyH9p4Q88YJwvUslfuMmN98w/2rdGRLPqJYObapBCdzBVeDgYWdJnFPFb7qzpg==", "dev": true, "license": "MIT", "dependencies": { - "@azure/abort-controller": "^2.0.0", - "@azure/core-util": "^1.11.0", + "@azure/abort-controller": "^2.1.2", + "@azure/core-util": "^1.13.0", "tslib": "^2.6.2" }, "engines": { @@ -394,18 +395,18 @@ } }, "node_modules/@azure/core-client": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.10.0.tgz", - "integrity": "sha512-O4aP3CLFNodg8eTHXECaH3B3CjicfzkxVtnrfLkOq0XNP7TIECGfHpK/C6vADZkWP75wzmdBnsIA8ksuJMk18g==", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.10.1.tgz", + "integrity": "sha512-Nh5PhEOeY6PrnxNPsEHRr9eimxLwgLlpmguQaHKBinFYA/RU9+kOYVOQqOrTsCL+KSxrLLl1gD8Dk5BFW/7l/w==", "dev": true, "license": "MIT", "dependencies": { - "@azure/abort-controller": "^2.0.0", - "@azure/core-auth": "^1.4.0", - "@azure/core-rest-pipeline": "^1.20.0", - "@azure/core-tracing": "^1.0.0", - "@azure/core-util": "^1.6.1", - "@azure/logger": "^1.0.0", + "@azure/abort-controller": "^2.1.2", + "@azure/core-auth": "^1.10.0", + "@azure/core-rest-pipeline": "^1.22.0", + "@azure/core-tracing": "^1.3.0", + "@azure/core-util": "^1.13.0", + "@azure/logger": "^1.3.0", "tslib": "^2.6.2" }, "engines": { @@ -413,18 +414,18 @@ } }, "node_modules/@azure/core-http-compat": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@azure/core-http-compat/-/core-http-compat-2.3.0.tgz", - "integrity": "sha512-qLQujmUypBBG0gxHd0j6/Jdmul6ttl24c8WGiLXIk7IHXdBlfoBqW27hyz3Xn6xbfdyVSarl1Ttbk0AwnZBYCw==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@azure/core-http-compat/-/core-http-compat-2.3.1.tgz", + "integrity": "sha512-az9BkXND3/d5VgdRRQVkiJb2gOmDU8Qcq4GvjtBmDICNiQ9udFmDk4ZpSB5Qq1OmtDJGlQAfBaS4palFsazQ5g==", "dev": true, "license": "MIT", "dependencies": { - "@azure/abort-controller": "^2.0.0", - "@azure/core-client": "^1.3.0", - "@azure/core-rest-pipeline": "^1.20.0" + "@azure/abort-controller": "^2.1.2", + "@azure/core-client": "^1.10.0", + "@azure/core-rest-pipeline": "^1.22.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, "node_modules/@azure/core-lro": { @@ -457,17 +458,17 @@ } }, "node_modules/@azure/core-rest-pipeline": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.22.0.tgz", - "integrity": "sha512-OKHmb3/Kpm06HypvB3g6Q3zJuvyXcpxDpCS1PnU8OV6AJgSFaee/covXBcPbWc6XDDxtEPlbi3EMQ6nUiPaQtw==", + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.22.1.tgz", + "integrity": "sha512-UVZlVLfLyz6g3Hy7GNDpooMQonUygH7ghdiSASOOHy97fKj/mPLqgDX7aidOijn+sCMU+WU8NjlPlNTgnvbcGA==", "dev": true, "license": "MIT", "dependencies": { - "@azure/abort-controller": "^2.0.0", - "@azure/core-auth": "^1.8.0", - "@azure/core-tracing": "^1.0.1", - "@azure/core-util": "^1.11.0", - "@azure/logger": "^1.0.0", + "@azure/abort-controller": "^2.1.2", + "@azure/core-auth": "^1.10.0", + "@azure/core-tracing": "^1.3.0", + "@azure/core-util": "^1.13.0", + "@azure/logger": "^1.3.0", "@typespec/ts-http-runtime": "^0.3.0", "tslib": "^2.6.2" }, @@ -476,9 +477,9 @@ } }, "node_modules/@azure/core-tracing": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.3.0.tgz", - "integrity": "sha512-+XvmZLLWPe67WXNZo9Oc9CrPj/Tm8QnHR92fFAFdnbzwNdCH1h+7UdpaQgRSBsMY+oW1kHXNUZQLdZ1gHX3ROw==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.3.1.tgz", + "integrity": "sha512-9MWKevR7Hz8kNzzPLfX4EAtGM2b8mr50HPDBvio96bURP/9C+HjdH3sBlLSNNrvRAr5/k/svoH457gB5IKpmwQ==", "dev": true, "license": "MIT", "dependencies": { @@ -489,13 +490,13 @@ } }, "node_modules/@azure/core-util": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.13.0.tgz", - "integrity": "sha512-o0psW8QWQ58fq3i24Q1K2XfS/jYTxr7O1HRcyUE9bV9NttLU+kYOH82Ixj8DGlMTOWgxm1Sss2QAfKK5UkSPxw==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.13.1.tgz", + "integrity": "sha512-XPArKLzsvl0Hf0CaGyKHUyVgF7oDnhKoP85Xv6M4StF/1AhfORhZudHtOyf2s+FcbuQ9dPRAjB8J2KvRRMUK2A==", "dev": true, "license": "MIT", "dependencies": { - "@azure/abort-controller": "^2.0.0", + "@azure/abort-controller": "^2.1.2", "@typespec/ts-http-runtime": "^0.3.0", "tslib": "^2.6.2" }, @@ -504,9 +505,9 @@ } }, "node_modules/@azure/identity": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-4.11.1.tgz", - "integrity": "sha512-0ZdsLRaOyLxtCYgyuqyWqGU5XQ9gGnjxgfoNTt1pvELGkkUFrMATABZFIq8gusM7N1qbqpVtwLOhk0d/3kacLg==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-4.12.0.tgz", + "integrity": "sha512-6vuh2R3Cte6SD6azNalLCjIDoryGdcvDVEV7IDRPtm5lHX5ffkDlIalaoOp5YJU08e4ipjJENel20kSMDLAcug==", "dev": true, "license": "MIT", "dependencies": { @@ -617,22 +618,22 @@ } }, "node_modules/@azure/msal-browser": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-4.22.0.tgz", - "integrity": "sha512-JLWHzAW1aZ/L190Th56jN+2t3T1dMvXOs1obXYLEr3ZWi81vVmBCt0di3mPvTTOiWoE0Cf/4hVQ/LINilqjObA==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-4.24.0.tgz", + "integrity": "sha512-BNoiUEx4olj16U9ZiquvIhG1dZBnwWSzSXiSclq/9qiFQXYeLOKqEaEv98+xLXJ3oLw9APwHTR1eY2Qk0v6XBQ==", "dev": true, "license": "MIT", "dependencies": { - "@azure/msal-common": "15.12.0" + "@azure/msal-common": "15.13.0" }, "engines": { "node": ">=0.8.0" } }, "node_modules/@azure/msal-common": { - "version": "15.12.0", - "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-15.12.0.tgz", - "integrity": "sha512-4ucXbjVw8KJ5QBgnGJUeA07c8iznwlk5ioHIhI4ASXcXgcf2yRFhWzYOyWg/cI49LC9ekpFJeQtO3zjDTbl6TQ==", + "version": "15.13.0", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-15.13.0.tgz", + "integrity": "sha512-8oF6nj02qX7eE/6+wFT5NluXRHc05AgdCC3fJnkjiJooq8u7BcLmxaYYSwc2AfEkWRMRi6Eyvvbeqk4U4412Ag==", "dev": true, "license": "MIT", "engines": { @@ -640,13 +641,13 @@ } }, "node_modules/@azure/msal-node": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-3.7.3.tgz", - "integrity": "sha512-MoJxkKM/YpChfq4g2o36tElyzNUMG8mfD6u8NbuaPAsqfGpaw249khAcJYNoIOigUzRw45OjXCOrexE6ImdUxg==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-3.8.0.tgz", + "integrity": "sha512-23BXm82Mp5XnRhrcd4mrHa0xuUNRp96ivu3nRatrfdAqjoeWAGyD0eEAafxAOHAEWWmdlyFK4ELFcdziXyw2sA==", "dev": true, "license": "MIT", "dependencies": { - "@azure/msal-common": "15.12.0", + "@azure/msal-common": "15.13.0", "jsonwebtoken": "^9.0.0", "uuid": "^8.3.0" }, @@ -748,9 +749,9 @@ } }, "node_modules/@babel/generator/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.30", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz", - "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==", + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, "license": "MIT", "dependencies": { @@ -2403,9 +2404,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz", - "integrity": "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.10.tgz", + "integrity": "sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==", "cpu": [ "ppc64" ], @@ -2419,9 +2420,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.9.tgz", - "integrity": "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.10.tgz", + "integrity": "sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==", "cpu": [ "arm" ], @@ -2435,9 +2436,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz", - "integrity": "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.10.tgz", + "integrity": "sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==", "cpu": [ "arm64" ], @@ -2451,9 +2452,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.9.tgz", - "integrity": "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.10.tgz", + "integrity": "sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==", "cpu": [ "x64" ], @@ -2467,9 +2468,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz", - "integrity": "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.10.tgz", + "integrity": "sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==", "cpu": [ "arm64" ], @@ -2483,9 +2484,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz", - "integrity": "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.10.tgz", + "integrity": "sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==", "cpu": [ "x64" ], @@ -2499,9 +2500,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz", - "integrity": "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.10.tgz", + "integrity": "sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==", "cpu": [ "arm64" ], @@ -2515,9 +2516,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz", - "integrity": "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.10.tgz", + "integrity": "sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==", "cpu": [ "x64" ], @@ -2531,9 +2532,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz", - "integrity": "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.10.tgz", + "integrity": "sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==", "cpu": [ "arm" ], @@ -2547,9 +2548,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz", - "integrity": "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.10.tgz", + "integrity": "sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==", "cpu": [ "arm64" ], @@ -2563,9 +2564,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz", - "integrity": "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.10.tgz", + "integrity": "sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==", "cpu": [ "ia32" ], @@ -2579,9 +2580,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz", - "integrity": "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.10.tgz", + "integrity": "sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==", "cpu": [ "loong64" ], @@ -2595,9 +2596,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz", - "integrity": "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.10.tgz", + "integrity": "sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==", "cpu": [ "mips64el" ], @@ -2611,9 +2612,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz", - "integrity": "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.10.tgz", + "integrity": "sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==", "cpu": [ "ppc64" ], @@ -2627,9 +2628,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz", - "integrity": "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.10.tgz", + "integrity": "sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==", "cpu": [ "riscv64" ], @@ -2643,9 +2644,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz", - "integrity": "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.10.tgz", + "integrity": "sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==", "cpu": [ "s390x" ], @@ -2659,9 +2660,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz", - "integrity": "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.10.tgz", + "integrity": "sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==", "cpu": [ "x64" ], @@ -2675,9 +2676,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz", - "integrity": "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.10.tgz", + "integrity": "sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==", "cpu": [ "arm64" ], @@ -2691,9 +2692,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz", - "integrity": "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.10.tgz", + "integrity": "sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==", "cpu": [ "x64" ], @@ -2707,9 +2708,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz", - "integrity": "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.10.tgz", + "integrity": "sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==", "cpu": [ "arm64" ], @@ -2723,9 +2724,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz", - "integrity": "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.10.tgz", + "integrity": "sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==", "cpu": [ "x64" ], @@ -2739,9 +2740,9 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz", - "integrity": "sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.10.tgz", + "integrity": "sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==", "cpu": [ "arm64" ], @@ -2755,9 +2756,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz", - "integrity": "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.10.tgz", + "integrity": "sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==", "cpu": [ "x64" ], @@ -2771,9 +2772,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz", - "integrity": "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.10.tgz", + "integrity": "sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==", "cpu": [ "arm64" ], @@ -2787,9 +2788,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz", - "integrity": "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.10.tgz", + "integrity": "sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==", "cpu": [ "ia32" ], @@ -2803,9 +2804,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz", - "integrity": "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.10.tgz", + "integrity": "sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==", "cpu": [ "x64" ], @@ -2985,13 +2986,8 @@ "link": true }, "node_modules/@feathersjs/hooks": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@feathersjs/hooks/-/hooks-0.9.0.tgz", - "integrity": "sha512-kLfWnuhbC25CPkR1/TDcVs0rSiv0JLNxrpUivLwc7FUnkyeciRi5VOmC1SOzL2SOagcozu3+m4VQiONyzgfY7w==", - "license": "MIT", - "engines": { - "node": ">= 14" - } + "resolved": "packages/hooks", + "link": true }, "node_modules/@feathersjs/knex": { "resolved": "packages/knex", @@ -3158,9 +3154,9 @@ } }, "node_modules/@iconify-json/simple-icons": { - "version": "1.2.50", - "resolved": "https://registry.npmjs.org/@iconify-json/simple-icons/-/simple-icons-1.2.50.tgz", - "integrity": "sha512-Z2ggRwKYEBB9eYAEi4NqEgIzyLhu0Buh4+KGzMPD6+xG7mk52wZJwLT/glDPtfslV503VtJbqzWqBUGkCMKOFA==", + "version": "1.2.53", + "resolved": "https://registry.npmjs.org/@iconify-json/simple-icons/-/simple-icons-1.2.53.tgz", + "integrity": "sha512-8GEW5mshsPAZpVAJmkBG/niR2qn8t4U03Wmz6aSD9R4VMZKTECqbOxH3z4inA0JfZOoTvP4qoK9T2VXAx2Xg5g==", "dev": true, "license": "CC0-1.0", "dependencies": { @@ -3175,9 +3171,9 @@ "license": "MIT" }, "node_modules/@iconify/utils": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-3.0.1.tgz", - "integrity": "sha512-A78CUEnFGX8I/WlILxJCuIJXloL0j/OJ9PSchPAfCargEIKmUBWvvEMmKWB5oONwiUqlNt+5eRufdkLxeHIWYw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-3.0.2.tgz", + "integrity": "sha512-EfJS0rLfVuRuJRn4psJHtK2A9TqVnkxPpHY6lYHiB9+8eSuudsxbwMiavocG45ujOo6FJ+CIRlRnlOGinzkaGQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3205,14 +3201,13 @@ } }, "node_modules/@inquirer/external-editor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.1.tgz", - "integrity": "sha512-Oau4yL24d2B5IL4ma4UpbQigkVhzPDXLoqy1ggK4gnHg/stmkffJE4oOXHXF3uz0UEpywG68KcyXsyYpA1Re/Q==", - "dev": true, + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.2.tgz", + "integrity": "sha512-yy9cOoBnx58TlsPrIxauKIFQTiyH+0MK4e97y4sV9ERbI+zDxw7i2hxHLCIEGIE/8PPvDxGhgzIOTSOWcs6/MQ==", "license": "MIT", "dependencies": { "chardet": "^2.1.0", - "iconv-lite": "^0.6.3" + "iconv-lite": "^0.7.0" }, "engines": { "node": ">=18" @@ -3226,26 +3221,6 @@ } } }, - "node_modules/@inquirer/external-editor/node_modules/chardet": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.0.tgz", - "integrity": "sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@inquirer/external-editor/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/@inquirer/figures": { "version": "1.0.13", "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.13.tgz", @@ -3400,9 +3375,9 @@ } }, "node_modules/@jridgewell/gen-mapping/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.30", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz", - "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==", + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, "license": "MIT", "dependencies": { @@ -3422,9 +3397,9 @@ } }, "node_modules/@jridgewell/remapping/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.30", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz", - "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==", + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, "license": "MIT", "dependencies": { @@ -3454,9 +3429,9 @@ } }, "node_modules/@jridgewell/source-map/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.30", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz", - "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==", + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, "license": "MIT", "dependencies": { @@ -3501,9 +3476,9 @@ } }, "node_modules/@lerna/create": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/@lerna/create/-/create-8.2.3.tgz", - "integrity": "sha512-f+68+iojcQ0tZRMfCgQyJdsdz+YPu3/d+0Zo1RJz92bgBxTCiEU+dHACVq1n3sEjm/YWPnFGdag8U5EYYmP3WA==", + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/@lerna/create/-/create-8.2.4.tgz", + "integrity": "sha512-A8AlzetnS2WIuhijdAzKUyFpR5YbLLfV3luQ4lzBgIBgRfuoBDZeF+RSZPhra+7A6/zTUlrbhKZIOi/MNhqgvQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3540,7 +3515,6 @@ "js-yaml": "4.1.0", "libnpmpublish": "9.0.9", "load-json-file": "6.2.0", - "lodash": "^4.17.21", "make-dir": "4.0.0", "minimatch": "3.0.5", "multimatch": "5.0.0", @@ -4255,16 +4229,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@nx/devkit/node_modules/tmp": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", - "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.14" - } - }, "node_modules/@nx/nx-darwin-arm64": { "version": "20.8.2", "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-20.8.2.tgz", @@ -5127,9 +5091,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.50.1.tgz", - "integrity": "sha512-HJXwzoZN4eYTdD8bVV22DN8gsPCAj3V20NHKOs8ezfXanGpmVPR7kalUHd+Y31IJp9stdB87VKPFbsGY3H/2ag==", + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.2.tgz", + "integrity": "sha512-o3pcKzJgSGt4d74lSZ+OCnHwkKBeAbFDmbEm5gg70eA8VkyCuC/zV9TwBnmw6VjDlRdF4Pshfb+WE9E6XY1PoQ==", "cpu": [ "arm" ], @@ -5141,9 +5105,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.50.1.tgz", - "integrity": "sha512-PZlsJVcjHfcH53mOImyt3bc97Ep3FJDXRpk9sMdGX0qgLmY0EIWxCag6EigerGhLVuL8lDVYNnSo8qnTElO4xw==", + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.2.tgz", + "integrity": "sha512-cqFSWO5tX2vhC9hJTK8WAiPIm4Q8q/cU8j2HQA0L3E1uXvBYbOZMhE2oFL8n2pKB5sOCHY6bBuHaRwG7TkfJyw==", "cpu": [ "arm64" ], @@ -5155,9 +5119,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.50.1.tgz", - "integrity": "sha512-xc6i2AuWh++oGi4ylOFPmzJOEeAa2lJeGUGb4MudOtgfyyjr4UPNK+eEWTPLvmPJIY/pgw6ssFIox23SyrkkJw==", + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.2.tgz", + "integrity": "sha512-vngduywkkv8Fkh3wIZf5nFPXzWsNsVu1kvtLETWxTFf/5opZmflgVSeLgdHR56RQh71xhPhWoOkEBvbehwTlVA==", "cpu": [ "arm64" ], @@ -5169,9 +5133,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.50.1.tgz", - "integrity": "sha512-2ofU89lEpDYhdLAbRdeyz/kX3Y2lpYc6ShRnDjY35bZhd2ipuDMDi6ZTQ9NIag94K28nFMofdnKeHR7BT0CATw==", + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.2.tgz", + "integrity": "sha512-h11KikYrUCYTrDj6h939hhMNlqU2fo/X4NB0OZcys3fya49o1hmFaczAiJWVAFgrM1NCP6RrO7lQKeVYSKBPSQ==", "cpu": [ "x64" ], @@ -5183,9 +5147,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.50.1.tgz", - "integrity": "sha512-wOsE6H2u6PxsHY/BeFHA4VGQN3KUJFZp7QJBmDYI983fgxq5Th8FDkVuERb2l9vDMs1D5XhOrhBrnqcEY6l8ZA==", + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.2.tgz", + "integrity": "sha512-/eg4CI61ZUkLXxMHyVlmlGrSQZ34xqWlZNW43IAU4RmdzWEx0mQJ2mN/Cx4IHLVZFL6UBGAh+/GXhgvGb+nVxw==", "cpu": [ "arm64" ], @@ -5197,9 +5161,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.50.1.tgz", - "integrity": "sha512-A/xeqaHTlKbQggxCqispFAcNjycpUEHP52mwMQZUNqDUJFFYtPHCXS1VAG29uMlDzIVr+i00tSFWFLivMcoIBQ==", + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.2.tgz", + "integrity": "sha512-QOWgFH5X9+p+S1NAfOqc0z8qEpJIoUHf7OWjNUGOeW18Mx22lAUOiA9b6r2/vpzLdfxi/f+VWsYjUOMCcYh0Ng==", "cpu": [ "x64" ], @@ -5211,9 +5175,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.50.1.tgz", - "integrity": "sha512-54v4okehwl5TaSIkpp97rAHGp7t3ghinRd/vyC1iXqXMfjYUTm7TfYmCzXDoHUPTTf36L8pr0E7YsD3CfB3ZDg==", + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.2.tgz", + "integrity": "sha512-kDWSPafToDd8LcBYd1t5jw7bD5Ojcu12S3uT372e5HKPzQt532vW+rGFFOaiR0opxePyUkHrwz8iWYEyH1IIQA==", "cpu": [ "arm" ], @@ -5225,9 +5189,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.50.1.tgz", - "integrity": "sha512-p/LaFyajPN/0PUHjv8TNyxLiA7RwmDoVY3flXHPSzqrGcIp/c2FjwPPP5++u87DGHtw+5kSH5bCJz0mvXngYxw==", + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.2.tgz", + "integrity": "sha512-gKm7Mk9wCv6/rkzwCiUC4KnevYhlf8ztBrDRT9g/u//1fZLapSRc+eDZj2Eu2wpJ+0RzUKgtNijnVIB4ZxyL+w==", "cpu": [ "arm" ], @@ -5239,9 +5203,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.50.1.tgz", - "integrity": "sha512-2AbMhFFkTo6Ptna1zO7kAXXDLi7H9fGTbVaIq2AAYO7yzcAsuTNWPHhb2aTA6GPiP+JXh85Y8CiS54iZoj4opw==", + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.2.tgz", + "integrity": "sha512-66lA8vnj5mB/rtDNwPgrrKUOtCLVQypkyDa2gMfOefXK6rcZAxKLO9Fy3GkW8VkPnENv9hBkNOFfGLf6rNKGUg==", "cpu": [ "arm64" ], @@ -5253,9 +5217,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.50.1.tgz", - "integrity": "sha512-Cgef+5aZwuvesQNw9eX7g19FfKX5/pQRIyhoXLCiBOrWopjo7ycfB292TX9MDcDijiuIJlx1IzJz3IoCPfqs9w==", + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.2.tgz", + "integrity": "sha512-s+OPucLNdJHvuZHuIz2WwncJ+SfWHFEmlC5nKMUgAelUeBUnlB4wt7rXWiyG4Zn07uY2Dd+SGyVa9oyLkVGOjA==", "cpu": [ "arm64" ], @@ -5266,10 +5230,10 @@ "linux" ] }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.50.1.tgz", - "integrity": "sha512-RPhTwWMzpYYrHrJAS7CmpdtHNKtt2Ueo+BlLBjfZEhYBhK00OsEqM08/7f+eohiF6poe0YRDDd8nAvwtE/Y62Q==", + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.2.tgz", + "integrity": "sha512-8wTRM3+gVMDLLDdaT6tKmOE3lJyRy9NpJUS/ZRWmLCmOPIJhVyXwjBo+XbrrwtV33Em1/eCTd5TuGJm4+DmYjw==", "cpu": [ "loong64" ], @@ -5281,9 +5245,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.50.1.tgz", - "integrity": "sha512-eSGMVQw9iekut62O7eBdbiccRguuDgiPMsw++BVUg+1K7WjZXHOg/YOT9SWMzPZA+w98G+Fa1VqJgHZOHHnY0Q==", + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.2.tgz", + "integrity": "sha512-6yqEfgJ1anIeuP2P/zhtfBlDpXUb80t8DpbYwXQ3bQd95JMvUaqiX+fKqYqUwZXqdJDd8xdilNtsHM2N0cFm6A==", "cpu": [ "ppc64" ], @@ -5295,9 +5259,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.50.1.tgz", - "integrity": "sha512-S208ojx8a4ciIPrLgazF6AgdcNJzQE4+S9rsmOmDJkusvctii+ZvEuIC4v/xFqzbuP8yDjn73oBlNDgF6YGSXQ==", + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.2.tgz", + "integrity": "sha512-sshYUiYVSEI2B6dp4jMncwxbrUqRdNApF2c3bhtLAU0qA8Lrri0p0NauOsTWh3yCCCDyBOjESHMExonp7Nzc0w==", "cpu": [ "riscv64" ], @@ -5309,9 +5273,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.50.1.tgz", - "integrity": "sha512-3Ag8Ls1ggqkGUvSZWYcdgFwriy2lWo+0QlYgEFra/5JGtAd6C5Hw59oojx1DeqcA2Wds2ayRgvJ4qxVTzCHgzg==", + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.2.tgz", + "integrity": "sha512-duBLgd+3pqC4MMwBrKkFxaZerUxZcYApQVC5SdbF5/e/589GwVvlRUnyqMFbM8iUSb1BaoX/3fRL7hB9m2Pj8Q==", "cpu": [ "riscv64" ], @@ -5323,9 +5287,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.50.1.tgz", - "integrity": "sha512-t9YrKfaxCYe7l7ldFERE1BRg/4TATxIg+YieHQ966jwvo7ddHJxPj9cNFWLAzhkVsbBvNA4qTbPVNsZKBO4NSg==", + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.2.tgz", + "integrity": "sha512-tzhYJJidDUVGMgVyE+PmxENPHlvvqm1KILjjZhB8/xHYqAGeizh3GBGf9u6WdJpZrz1aCpIIHG0LgJgH9rVjHQ==", "cpu": [ "s390x" ], @@ -5337,9 +5301,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.50.1.tgz", - "integrity": "sha512-MCgtFB2+SVNuQmmjHf+wfI4CMxy3Tk8XjA5Z//A0AKD7QXUYFMQcns91K6dEHBvZPCnhJSyDWLApk40Iq/H3tA==", + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.2.tgz", + "integrity": "sha512-opH8GSUuVcCSSyHHcl5hELrmnk4waZoVpgn/4FDao9iyE4WpQhyWJ5ryl5M3ocp4qkRuHfyXnGqg8M9oKCEKRA==", "cpu": [ "x64" ], @@ -5351,9 +5315,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.50.1.tgz", - "integrity": "sha512-nEvqG+0jeRmqaUMuwzlfMKwcIVffy/9KGbAGyoa26iu6eSngAYQ512bMXuqqPrlTyfqdlB9FVINs93j534UJrg==", + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.2.tgz", + "integrity": "sha512-LSeBHnGli1pPKVJ79ZVJgeZWWZXkEe/5o8kcn23M8eMKCUANejchJbF/JqzM4RRjOJfNRhKJk8FuqL1GKjF5oQ==", "cpu": [ "x64" ], @@ -5365,9 +5329,9 @@ ] }, "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.50.1.tgz", - "integrity": "sha512-RDsLm+phmT3MJd9SNxA9MNuEAO/J2fhW8GXk62G/B4G7sLVumNFbRwDL6v5NrESb48k+QMqdGbHgEtfU0LCpbA==", + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.2.tgz", + "integrity": "sha512-uPj7MQ6/s+/GOpolavm6BPo+6CbhbKYyZHUDvZ/SmJM7pfDBgdGisFX3bY/CBDMg2ZO4utfhlApkSfZ92yXw7Q==", "cpu": [ "arm64" ], @@ -5379,9 +5343,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.50.1.tgz", - "integrity": "sha512-hpZB/TImk2FlAFAIsoElM3tLzq57uxnGYwplg6WDyAxbYczSi8O2eQ+H2Lx74504rwKtZ3N2g4bCUkiamzS6TQ==", + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.2.tgz", + "integrity": "sha512-Z9MUCrSgIaUeeHAiNkm3cQyst2UhzjPraR3gYYfOjAuZI7tcFRTOD+4cHLPoS/3qinchth+V56vtqz1Tv+6KPA==", "cpu": [ "arm64" ], @@ -5393,9 +5357,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.50.1.tgz", - "integrity": "sha512-SXjv8JlbzKM0fTJidX4eVsH+Wmnp0/WcD8gJxIZyR6Gay5Qcsmdbi9zVtnbkGPG8v2vMR1AD06lGWy5FLMcG7A==", + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.2.tgz", + "integrity": "sha512-+GnYBmpjldD3XQd+HMejo+0gJGwYIOfFeoBQv32xF/RUIvccUz20/V6Otdv+57NE70D5pa8W/jVGDoGq0oON4A==", "cpu": [ "ia32" ], @@ -5406,10 +5370,24 @@ "win32" ] }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.2.tgz", + "integrity": "sha512-ApXFKluSB6kDQkAqZOKXBjiaqdF1BlKi+/eqnYe9Ee7U2K3pUDKsIyr8EYm/QDHTJIM+4X+lI0gJc3TTRhd+dA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.50.1.tgz", - "integrity": "sha512-StxAO/8ts62KZVRAm4JZYq9+NqNsV7RvimNK+YM7ry//zebEH6meuugqW/P5OFUCjyQgui+9fUxT6d5NShvMvA==", + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.2.tgz", + "integrity": "sha512-ARz+Bs8kY6FtitYM96PqPEVvPXqEZmPZsSkXvyX19YzDqkCaIlhCieLLMI5hxO9SRZ2XtCtm8wxhy0iJ2jxNfw==", "cpu": [ "x64" ], @@ -5421,54 +5399,54 @@ ] }, "node_modules/@shikijs/core": { - "version": "3.12.2", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-3.12.2.tgz", - "integrity": "sha512-L1Safnhra3tX/oJK5kYHaWmLEBJi1irASwewzY3taX5ibyXyMkkSDZlq01qigjryOBwrXSdFgTiZ3ryzSNeu7Q==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-3.13.0.tgz", + "integrity": "sha512-3P8rGsg2Eh2qIHekwuQjzWhKI4jV97PhvYjYUzGqjvJfqdQPz+nMlfWahU24GZAyW1FxFI1sYjyhfh5CoLmIUA==", "license": "MIT", "dependencies": { - "@shikijs/types": "3.12.2", + "@shikijs/types": "3.13.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "node_modules/@shikijs/engine-javascript": { - "version": "3.12.2", - "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-3.12.2.tgz", - "integrity": "sha512-Nm3/azSsaVS7hk6EwtHEnTythjQfwvrO5tKqMlaH9TwG1P+PNaR8M0EAKZ+GaH2DFwvcr4iSfTveyxMIvXEHMw==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-3.13.0.tgz", + "integrity": "sha512-Ty7xv32XCp8u0eQt8rItpMs6rU9Ki6LJ1dQOW3V/56PKDcpvfHPnYFbsx5FFUP2Yim34m/UkazidamMNVR4vKg==", "license": "MIT", "dependencies": { - "@shikijs/types": "3.12.2", + "@shikijs/types": "3.13.0", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.3.3" } }, "node_modules/@shikijs/engine-oniguruma": { - "version": "3.12.2", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.12.2.tgz", - "integrity": "sha512-hozwnFHsLvujK4/CPVHNo3Bcg2EsnG8krI/ZQ2FlBlCRpPZW4XAEQmEwqegJsypsTAN9ehu2tEYe30lYKSZW/w==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.13.0.tgz", + "integrity": "sha512-O42rBGr4UDSlhT2ZFMxqM7QzIU+IcpoTMzb3W7AlziI1ZF7R8eS2M0yt5Ry35nnnTX/LTLXFPUjRFCIW+Operg==", "license": "MIT", "dependencies": { - "@shikijs/types": "3.12.2", + "@shikijs/types": "3.13.0", "@shikijs/vscode-textmate": "^10.0.2" } }, "node_modules/@shikijs/langs": { - "version": "3.12.2", - "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.12.2.tgz", - "integrity": "sha512-bVx5PfuZHDSHoBal+KzJZGheFuyH4qwwcwG/n+MsWno5cTlKmaNtTsGzJpHYQ8YPbB5BdEdKU1rga5/6JGY8ww==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.13.0.tgz", + "integrity": "sha512-672c3WAETDYHwrRP0yLy3W1QYB89Hbpj+pO4KhxK6FzIrDI2FoEXNiNCut6BQmEApYLfuYfpgOZaqbY+E9b8wQ==", "license": "MIT", "dependencies": { - "@shikijs/types": "3.12.2" + "@shikijs/types": "3.13.0" } }, "node_modules/@shikijs/themes": { - "version": "3.12.2", - "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.12.2.tgz", - "integrity": "sha512-fTR3QAgnwYpfGczpIbzPjlRnxyONJOerguQv1iwpyQZ9QXX4qy/XFQqXlf17XTsorxnHoJGbH/LXBvwtqDsF5A==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.13.0.tgz", + "integrity": "sha512-Vxw1Nm1/Od8jyA7QuAenaV78BG2nSr3/gCGdBkLpfLscddCkzkL36Q5b67SrLLfvAJTOUzW39x4FHVCFriPVgg==", "license": "MIT", "dependencies": { - "@shikijs/types": "3.12.2" + "@shikijs/types": "3.13.0" } }, "node_modules/@shikijs/transformers": { @@ -5544,9 +5522,9 @@ } }, "node_modules/@shikijs/types": { - "version": "3.12.2", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.12.2.tgz", - "integrity": "sha512-K5UIBzxCyv0YoxN3LMrKB9zuhp1bV+LgewxuVwHdl4Gz5oePoUFrr9EfgJlGlDeXCU1b/yhdnXeuRvAnz8HN8Q==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.13.0.tgz", + "integrity": "sha512-oM9P+NCFri/mmQ8LoFGVfVyemm5Hi27330zuOBp0annwJdKH1kOLndw3zCtAVDehPLg9fKqoEx3Ht/wNZxolfw==", "license": "MIT", "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", @@ -5922,21 +5900,20 @@ "license": "MIT" }, "node_modules/@types/express": { - "version": "4.17.23", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.23.tgz", - "integrity": "sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.3.tgz", + "integrity": "sha512-wGA0NX93b19/dZC1J18tKWVIYWyyF2ZjT9vin/NRu0qzzvfVzWjs04iq2rQ3H65vCTQYlRqs3YHfY7zjdV+9Kw==", "license": "MIT", "dependencies": { "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", + "@types/express-serve-static-core": "^5.0.0", "@types/serve-static": "*" } }, "node_modules/@types/express-serve-static-core": { - "version": "4.19.6", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", - "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.7.tgz", + "integrity": "sha512-R+33OsgWw7rOhD1emjU7dzCDHucJrgJXMA5PYCzJxVil0dsyx5iBEPHqpPfiKNJQb7lZ1vxwoLR4Z87bBUpeGQ==", "license": "MIT", "dependencies": { "@types/node": "*", @@ -6029,16 +6006,16 @@ "license": "MIT" }, "node_modules/@types/koa": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.15.0.tgz", - "integrity": "sha512-7QFsywoE5URbuVnG3loe03QXuGajrnotr3gQkXcEBShORai23MePfFYdhz90FEtBBpkyIYQbVD+evKtloCgX3g==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/koa/-/koa-3.0.0.tgz", + "integrity": "sha512-MOcVYdVYmkSutVHZZPh8j3+dAjLyR5Tl59CN0eKgpkE1h/LBSmPAsQQuWs+bKu7WtGNn+hKfJH9Gzml+PulmDg==", "license": "MIT", "dependencies": { "@types/accepts": "*", "@types/content-disposition": "*", "@types/cookies": "*", "@types/http-assert": "*", - "@types/http-errors": "*", + "@types/http-errors": "^2", "@types/keygrip": "*", "@types/koa-compose": "*", "@types/node": "*" @@ -6200,23 +6177,12 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.3.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.1.tgz", - "integrity": "sha512-3vXmQDXy+woz+gnrTvuvNrPzekOi+Ds0ReMxw0LzBiK3a+1k0kQn9f2NWk+lgD4rJehFUmYy2gMhJ2ZI+7YP9g==", - "license": "MIT", - "dependencies": { - "undici-types": "~7.10.0" - } - }, - "node_modules/@types/node-fetch": { - "version": "2.6.13", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.13.tgz", - "integrity": "sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw==", - "dev": true, + "version": "24.5.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.5.2.tgz", + "integrity": "sha512-FYxk1I7wPv3K2XBaoyH2cTnocQEu8AOZ60hPbsyukMPLv5/5qr7V1i8PLHdl6Zf87I+xZXFvPCXYjiTFq+YSDQ==", "license": "MIT", "dependencies": { - "@types/node": "*", - "form-data": "^4.0.4" + "undici-types": "~7.12.0" } }, "node_modules/@types/normalize-package-data": { @@ -6563,9 +6529,9 @@ } }, "node_modules/@typespec/ts-http-runtime": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@typespec/ts-http-runtime/-/ts-http-runtime-0.3.0.tgz", - "integrity": "sha512-sOx1PKSuFwnIl7z4RN0Ls7N9AQawmR9r66eI5rFCzLDIs8HTIYrIpH9QjYWoX0lkgGrkLxXhi4QnK7MizPRrIg==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@typespec/ts-http-runtime/-/ts-http-runtime-0.3.1.tgz", + "integrity": "sha512-SnbaqayTVFEA6/tYumdF0UmybY0KHyKwGPBXnyckFlrrKdhWFrL3a2HIPXHjht5ZOElKGcXfD2D63P36btb+ww==", "dev": true, "license": "MIT", "dependencies": { @@ -6584,15 +6550,15 @@ "license": "ISC" }, "node_modules/@unocss/astro": { - "version": "66.5.1", - "resolved": "https://registry.npmjs.org/@unocss/astro/-/astro-66.5.1.tgz", - "integrity": "sha512-f17+xfyBZ9prFx4jda3D9ngOigjO8btHsR3uG7WeDQPW6OBdhETfIGdXs8WD99J/3A3LJtk7J0u9p121S+RE8Q==", + "version": "66.5.2", + "resolved": "https://registry.npmjs.org/@unocss/astro/-/astro-66.5.2.tgz", + "integrity": "sha512-JUiJL4wkDTCFgReQ+c1Nqb47EfryJvGiSp9MxXclCUbp5hegqq7yMg3BMpJ4QzHmf5EeDFO38eRBKV57hd0Iew==", "dev": true, "license": "MIT", "dependencies": { - "@unocss/core": "66.5.1", - "@unocss/reset": "66.5.1", - "@unocss/vite": "66.5.1" + "@unocss/core": "66.5.2", + "@unocss/reset": "66.5.2", + "@unocss/vite": "66.5.2" }, "funding": { "url": "https://github.com/sponsors/antfu" @@ -6607,16 +6573,16 @@ } }, "node_modules/@unocss/cli": { - "version": "66.5.1", - "resolved": "https://registry.npmjs.org/@unocss/cli/-/cli-66.5.1.tgz", - "integrity": "sha512-b9fTS6b7lqTmeftDkZyjkJiC1LoCKzCB4vuX/VdqoHd0QWh02i6ppsfe6C69fMlzOrju01H7CL0Bpad0JzBr2A==", + "version": "66.5.2", + "resolved": "https://registry.npmjs.org/@unocss/cli/-/cli-66.5.2.tgz", + "integrity": "sha512-WFj3fd5LqPX2/NvG/kX4vxML14F5yU6e0yPezO+7fjrJ9V31m1AFQWfiT2p8HbNUcQd9jZ9lcoWLm3Q1FsdPDA==", "dev": true, "license": "MIT", "dependencies": { "@jridgewell/remapping": "^2.3.5", - "@unocss/config": "66.5.1", - "@unocss/core": "66.5.1", - "@unocss/preset-uno": "66.5.1", + "@unocss/config": "66.5.2", + "@unocss/core": "66.5.2", + "@unocss/preset-uno": "66.5.2", "cac": "^6.7.14", "chokidar": "^3.6.0", "colorette": "^2.0.20", @@ -6744,13 +6710,13 @@ } }, "node_modules/@unocss/config": { - "version": "66.5.1", - "resolved": "https://registry.npmjs.org/@unocss/config/-/config-66.5.1.tgz", - "integrity": "sha512-eL9P+WDX42B6ZkNGGSkMgOyR99xeuJ2Gkj0uarhag5kaRwvwHLn/CJptZ7/oZLLIn0uTH8TQ6MG8ErhK0ymewA==", + "version": "66.5.2", + "resolved": "https://registry.npmjs.org/@unocss/config/-/config-66.5.2.tgz", + "integrity": "sha512-rREBBt2a6aZJ21TCeKG3/wjHfTNPbIwdrJtIVrN7hLcljW2vnWuyYabZ1yASK8+lnNsMoBoU5mbakgrPF0MItA==", "dev": true, "license": "MIT", "dependencies": { - "@unocss/core": "66.5.1", + "@unocss/core": "66.5.2", "unconfig": "^7.3.3" }, "engines": { @@ -6761,9 +6727,9 @@ } }, "node_modules/@unocss/core": { - "version": "66.5.1", - "resolved": "https://registry.npmjs.org/@unocss/core/-/core-66.5.1.tgz", - "integrity": "sha512-BUgN87sUIffco1d+1IuV4a1gKTI1YAFa7CTjxglLUAnopXPPJ+Q77G10zoBoFLzutiIOYLsesa3hzbQvDhosnA==", + "version": "66.5.2", + "resolved": "https://registry.npmjs.org/@unocss/core/-/core-66.5.2.tgz", + "integrity": "sha512-POSEpwj2FJtrDgzSq6nVhAJbnGIYPqtEMTpzQXfeFqPDMidAXjaH/xZUeTdHDbI9Jg700smrRXJtFJrJFXkmiQ==", "dev": true, "license": "MIT", "funding": { @@ -6771,27 +6737,27 @@ } }, "node_modules/@unocss/extractor-arbitrary-variants": { - "version": "66.5.1", - "resolved": "https://registry.npmjs.org/@unocss/extractor-arbitrary-variants/-/extractor-arbitrary-variants-66.5.1.tgz", - "integrity": "sha512-SpI2uv6bWyPyY3Tv7CxsFnHBjSTlNRcPCnfvD8gSKbAt7R+RqV0nrdkv7wSW+Woc5TYl8PClLEFSBIvo0c1h9Q==", + "version": "66.5.2", + "resolved": "https://registry.npmjs.org/@unocss/extractor-arbitrary-variants/-/extractor-arbitrary-variants-66.5.2.tgz", + "integrity": "sha512-MNHzhA4RKJJVo6D5Uc+SkPfeugO1KXDt0GFg0FkOUKTTnahxyXNvd9BG9HHYlKSiaYCgUhFmysNhv04Gza+CNg==", "dev": true, "license": "MIT", "dependencies": { - "@unocss/core": "66.5.1" + "@unocss/core": "66.5.2" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@unocss/inspector": { - "version": "66.5.1", - "resolved": "https://registry.npmjs.org/@unocss/inspector/-/inspector-66.5.1.tgz", - "integrity": "sha512-EyHcEM9BPZACJhl9YoTlgc/5i4as9MQ4zwaThAXbXoO9l+IfxdNrJoy3ED8qqkKLO5jgzyhPvy1COBdaoSlxsg==", + "version": "66.5.2", + "resolved": "https://registry.npmjs.org/@unocss/inspector/-/inspector-66.5.2.tgz", + "integrity": "sha512-8PuM01lrsOuyas3K+5LqeoeiujIGk72ivvJsP4/T8h03XQWzpS7NPJU6JVJQUcYZAE+WtqFcPJ8wcg0ERKNPdA==", "dev": true, "license": "MIT", "dependencies": { - "@unocss/core": "66.5.1", - "@unocss/rule-utils": "66.5.1", + "@unocss/core": "66.5.2", + "@unocss/rule-utils": "66.5.2", "colorette": "^2.0.20", "gzip-size": "^6.0.0", "sirv": "^3.0.1", @@ -6809,15 +6775,15 @@ "license": "MIT" }, "node_modules/@unocss/postcss": { - "version": "66.5.1", - "resolved": "https://registry.npmjs.org/@unocss/postcss/-/postcss-66.5.1.tgz", - "integrity": "sha512-waJSgjJv14cbbaA3fj0kgDid+e851KfArqx1l5/c2km3g9tiPZhSiY3Z7YslwMyM9CKRC8+qN8AWYB9l4YJrFw==", + "version": "66.5.2", + "resolved": "https://registry.npmjs.org/@unocss/postcss/-/postcss-66.5.2.tgz", + "integrity": "sha512-tZrWVcGm1cJghYqRFgiCb/HCnWehdJ3/6lUlXN5Ogfu4agCa3f8QES43+6TMpuTKdqkjXvMI3jZFKNMgN+/wlg==", "dev": true, "license": "MIT", "dependencies": { - "@unocss/config": "66.5.1", - "@unocss/core": "66.5.1", - "@unocss/rule-utils": "66.5.1", + "@unocss/config": "66.5.2", + "@unocss/core": "66.5.2", + "@unocss/rule-utils": "66.5.2", "css-tree": "^3.1.0", "postcss": "^8.5.6", "tinyglobby": "^0.2.14" @@ -6881,27 +6847,27 @@ } }, "node_modules/@unocss/preset-attributify": { - "version": "66.5.1", - "resolved": "https://registry.npmjs.org/@unocss/preset-attributify/-/preset-attributify-66.5.1.tgz", - "integrity": "sha512-lRTwtg9y+f9c6OlRiiPrXrBco2r9SwVxNvzJ27Kc/DhJl3fphuMQuKWsZyiq1qsDVYZeGz4NQzE1FDKqFi4qqQ==", + "version": "66.5.2", + "resolved": "https://registry.npmjs.org/@unocss/preset-attributify/-/preset-attributify-66.5.2.tgz", + "integrity": "sha512-/FigYbT1uA5DLy5dVV2QuTizvSge8jZZZu3uGAu25p59m/h/6ZjvkCoiKcTkvmNUuZfj/ZPZmAE8GoSn1uR++A==", "dev": true, "license": "MIT", "dependencies": { - "@unocss/core": "66.5.1" + "@unocss/core": "66.5.2" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@unocss/preset-icons": { - "version": "66.5.1", - "resolved": "https://registry.npmjs.org/@unocss/preset-icons/-/preset-icons-66.5.1.tgz", - "integrity": "sha512-vxlnPSzTaQZmLKcmVPhCWC6rpgpHCUSD7aFsn7jW3iZ/jTIwc4kgQjnOJZdL443LF5mxBqF15+Cm9hZRnvrWNw==", + "version": "66.5.2", + "resolved": "https://registry.npmjs.org/@unocss/preset-icons/-/preset-icons-66.5.2.tgz", + "integrity": "sha512-vjSwttkZrU8FfIo4TCkSOAIba0xbWE6N3/xEdK3tjq+FSgClzs9SmO06KLJHSntJ/N5JYA0wpkPS5mLYxGMwqw==", "dev": true, "license": "MIT", "dependencies": { "@iconify/utils": "^3.0.1", - "@unocss/core": "66.5.1", + "@unocss/core": "66.5.2", "ofetch": "^1.4.1" }, "funding": { @@ -6909,66 +6875,66 @@ } }, "node_modules/@unocss/preset-mini": { - "version": "66.5.1", - "resolved": "https://registry.npmjs.org/@unocss/preset-mini/-/preset-mini-66.5.1.tgz", - "integrity": "sha512-kBEbA0kEXRtoHQ98o4b6f9sp1u5BanPzi+GMnWdmOWvbLAiLw1vcgXGPTX3sO+gzIMrwu0Famw6xiztWzAFjWQ==", + "version": "66.5.2", + "resolved": "https://registry.npmjs.org/@unocss/preset-mini/-/preset-mini-66.5.2.tgz", + "integrity": "sha512-YLOuYq7GNoWNgF3P41AtcvnOodSP49x0RNM4PR/ntGddl0BfsFaKeCGzt8DpbvavhQpBn0+kt4GP3RajKooAIQ==", "dev": true, "license": "MIT", "dependencies": { - "@unocss/core": "66.5.1", - "@unocss/extractor-arbitrary-variants": "66.5.1", - "@unocss/rule-utils": "66.5.1" + "@unocss/core": "66.5.2", + "@unocss/extractor-arbitrary-variants": "66.5.2", + "@unocss/rule-utils": "66.5.2" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@unocss/preset-tagify": { - "version": "66.5.1", - "resolved": "https://registry.npmjs.org/@unocss/preset-tagify/-/preset-tagify-66.5.1.tgz", - "integrity": "sha512-94dVIqfTT3Nfs+g9XnOC/oZuVsiSp8zR36wA/Uucvg3n1zIo2wg6qokghfh7ee8aYNdTqnV7extlnCMJp0TFJQ==", + "version": "66.5.2", + "resolved": "https://registry.npmjs.org/@unocss/preset-tagify/-/preset-tagify-66.5.2.tgz", + "integrity": "sha512-6AusDr1rD+HK22F4kwPLWqOImV3W+0nyPMsUwLVHQeaZktpSFSqaIQCI6aIVWyftvW/paST1Xc4HEHb7rKBF/w==", "dev": true, "license": "MIT", "dependencies": { - "@unocss/core": "66.5.1" + "@unocss/core": "66.5.2" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@unocss/preset-typography": { - "version": "66.5.1", - "resolved": "https://registry.npmjs.org/@unocss/preset-typography/-/preset-typography-66.5.1.tgz", - "integrity": "sha512-5gmv/BN3WbwlZJuoC5qyToK7ufbnmXEszj6+3Rgtto4ptpyizBtJybyZe025ypcmExne3MwMpGWMmQPE5MzKgw==", + "version": "66.5.2", + "resolved": "https://registry.npmjs.org/@unocss/preset-typography/-/preset-typography-66.5.2.tgz", + "integrity": "sha512-Ez3VWrNlJVa9cywsI/IwUdZ4OUeeUvf04pZmf+bwSU3CHqfonRT8K3+ndHQfuTJYbIb1k3few+cc1P1W7NP7Xw==", "dev": true, "license": "MIT", "dependencies": { - "@unocss/core": "66.5.1", - "@unocss/rule-utils": "66.5.1" + "@unocss/core": "66.5.2", + "@unocss/rule-utils": "66.5.2" } }, "node_modules/@unocss/preset-uno": { - "version": "66.5.1", - "resolved": "https://registry.npmjs.org/@unocss/preset-uno/-/preset-uno-66.5.1.tgz", - "integrity": "sha512-nUjh1XMChHpVJng5zJhYXXZcXxVDfmh2dxdZS4DgKQ08F8HdvFXmZV+sJrrw6JdeUtpDytelLFJbA8ejmxHYhA==", + "version": "66.5.2", + "resolved": "https://registry.npmjs.org/@unocss/preset-uno/-/preset-uno-66.5.2.tgz", + "integrity": "sha512-+raFp6uRwvQVIS7y8JoQI+5PPodl+uNsHxL9uH/JkelB5++ACrcP/ShN8RrDD97K+wtSP+3kr9SsK6dk0f2Mpg==", "dev": true, "license": "MIT", "dependencies": { - "@unocss/core": "66.5.1", - "@unocss/preset-wind3": "66.5.1" + "@unocss/core": "66.5.2", + "@unocss/preset-wind3": "66.5.2" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@unocss/preset-web-fonts": { - "version": "66.5.1", - "resolved": "https://registry.npmjs.org/@unocss/preset-web-fonts/-/preset-web-fonts-66.5.1.tgz", - "integrity": "sha512-XKrkoN7ncqJxRHDMxAqTCroBcqSPgryDUZIlLhhQ4mHilSp29AdYO1RgG6Ok04w9HNmqzo3d8A8v6Z5yGrGF0w==", + "version": "66.5.2", + "resolved": "https://registry.npmjs.org/@unocss/preset-web-fonts/-/preset-web-fonts-66.5.2.tgz", + "integrity": "sha512-xMFUE8Bhe2X/VlUBtdXTnDrrZL+WE99RaiBNLS1F1Na5r4Fc5Ck0p8a+SnMB7GDx5gtwf1ekKwi0pAP8+vIJnQ==", "dev": true, "license": "MIT", "dependencies": { - "@unocss/core": "66.5.1", + "@unocss/core": "66.5.2", "ofetch": "^1.4.1" }, "funding": { @@ -6976,53 +6942,53 @@ } }, "node_modules/@unocss/preset-wind": { - "version": "66.5.1", - "resolved": "https://registry.npmjs.org/@unocss/preset-wind/-/preset-wind-66.5.1.tgz", - "integrity": "sha512-YucMFPBa3Gwuxdtk+GlqWWcnCwMpzUJWkiB3BNyGk4wEJ0S/brkC+t1/DKpagOFLK9bc134mLxqLNDMWJwVbrg==", + "version": "66.5.2", + "resolved": "https://registry.npmjs.org/@unocss/preset-wind/-/preset-wind-66.5.2.tgz", + "integrity": "sha512-jJN7kLXNAn/6VpYWTrIJGsXAhziPlPhK7bdnilbVnrlTSOluG6peCE6gdUyjdlLDyYELzz8qZ7ZvOo77IsBkPQ==", "dev": true, "license": "MIT", "dependencies": { - "@unocss/core": "66.5.1", - "@unocss/preset-wind3": "66.5.1" + "@unocss/core": "66.5.2", + "@unocss/preset-wind3": "66.5.2" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@unocss/preset-wind3": { - "version": "66.5.1", - "resolved": "https://registry.npmjs.org/@unocss/preset-wind3/-/preset-wind3-66.5.1.tgz", - "integrity": "sha512-L1yMmKpwUWYUnScQq5jMTGvfMy/GBqVj40VS5afyOlzWnBeSkc/y4AxeW/khzGwqE/QaFcLWXiXwQVJIyxN02Q==", + "version": "66.5.2", + "resolved": "https://registry.npmjs.org/@unocss/preset-wind3/-/preset-wind3-66.5.2.tgz", + "integrity": "sha512-qgzLiPd6CkepLLssBod7ejQ4sKKqAvCOyjqpp0eFmHVUKGBEGPzOI1/WnbrAzvTHDonbSc52kB/XEWlgWmDhhA==", "dev": true, "license": "MIT", "dependencies": { - "@unocss/core": "66.5.1", - "@unocss/preset-mini": "66.5.1", - "@unocss/rule-utils": "66.5.1" + "@unocss/core": "66.5.2", + "@unocss/preset-mini": "66.5.2", + "@unocss/rule-utils": "66.5.2" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@unocss/preset-wind4": { - "version": "66.5.1", - "resolved": "https://registry.npmjs.org/@unocss/preset-wind4/-/preset-wind4-66.5.1.tgz", - "integrity": "sha512-i6UaZ/hRabu+bvEwUJcc3k/v/tF1sjKukvtQF027zaL3Q5k5QKKhDH989wVHU1k+i+W77+og2/K9+FzXN9+CzQ==", + "version": "66.5.2", + "resolved": "https://registry.npmjs.org/@unocss/preset-wind4/-/preset-wind4-66.5.2.tgz", + "integrity": "sha512-493Vb1do+05+3tdE0kU+SUKAPG9Spd+hItKfc09OL276T1DMj7AZzIq5q+rj9e+bOAjWAAutjw94RPNjKlU3fA==", "dev": true, "license": "MIT", "dependencies": { - "@unocss/core": "66.5.1", - "@unocss/extractor-arbitrary-variants": "66.5.1", - "@unocss/rule-utils": "66.5.1" + "@unocss/core": "66.5.2", + "@unocss/extractor-arbitrary-variants": "66.5.2", + "@unocss/rule-utils": "66.5.2" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@unocss/reset": { - "version": "66.5.1", - "resolved": "https://registry.npmjs.org/@unocss/reset/-/reset-66.5.1.tgz", - "integrity": "sha512-NXDjDUn3cjATkxr7bbPdVnKkUHzEq6wSC1IRpnO8ISAXCw6JGPjuk3WJVYxHhnAlszhDxdqxVBjWRZ+zzVmrZw==", + "version": "66.5.2", + "resolved": "https://registry.npmjs.org/@unocss/reset/-/reset-66.5.2.tgz", + "integrity": "sha512-DirXdqrkSp3fThRGOz0s0ehsYBpLb72Vh4QlPfMFuwHHFC9P9IDTLMUj5kD51A9fdy07Wrmhs7T5CQ//DlfOdQ==", "dev": true, "license": "MIT", "funding": { @@ -7030,13 +6996,13 @@ } }, "node_modules/@unocss/rule-utils": { - "version": "66.5.1", - "resolved": "https://registry.npmjs.org/@unocss/rule-utils/-/rule-utils-66.5.1.tgz", - "integrity": "sha512-GuBKHrDv3bdq5N1HfOr1tD864vI1EIiovBVJSfg7x9ERA4jJSnyMpGk/hbLuDIXF25EnVdZ1lFhEpJgur9+9sw==", + "version": "66.5.2", + "resolved": "https://registry.npmjs.org/@unocss/rule-utils/-/rule-utils-66.5.2.tgz", + "integrity": "sha512-2eR5TBTO+cmPY9ahFjyEu8qP/NFPI02dVpI0rgGKdyDMv/PnO9+yS/9rKgrmXsN3nPYHjOrLutRXkF/xxm/t3w==", "dev": true, "license": "MIT", "dependencies": { - "@unocss/core": "^66.5.1", + "@unocss/core": "^66.5.2", "magic-string": "^0.30.18" }, "engines": { @@ -7047,15 +7013,15 @@ } }, "node_modules/@unocss/transformer-attributify-jsx": { - "version": "66.5.1", - "resolved": "https://registry.npmjs.org/@unocss/transformer-attributify-jsx/-/transformer-attributify-jsx-66.5.1.tgz", - "integrity": "sha512-uj3W0zSY6LyRFusqeIEj8VUy6WDbIhNMUajIHRulKdSqufFMxiymn6JLGriz7ArFRXBKBBmbN+kk6Fqi9gF6JA==", + "version": "66.5.2", + "resolved": "https://registry.npmjs.org/@unocss/transformer-attributify-jsx/-/transformer-attributify-jsx-66.5.2.tgz", + "integrity": "sha512-mTa+fMKVz96He21E6FYCJyd0QbL6Xr5JjdqZEEFZiwt9N884g89pHZOlEURmrkQBrWc5NwSfzNB7lCkhuUOIFQ==", "dev": true, "license": "MIT", "dependencies": { "@babel/parser": "7.27.7", "@babel/traverse": "7.27.7", - "@unocss/core": "66.5.1" + "@unocss/core": "66.5.2" }, "funding": { "url": "https://github.com/sponsors/antfu" @@ -7107,54 +7073,54 @@ } }, "node_modules/@unocss/transformer-compile-class": { - "version": "66.5.1", - "resolved": "https://registry.npmjs.org/@unocss/transformer-compile-class/-/transformer-compile-class-66.5.1.tgz", - "integrity": "sha512-dEfXxWLt3lbMW85CI2yi0S/fQHcSZ32s9FSfGS3KPxFTJ3EY7tYYesT1bdzVrSm+o7J8Os42E5AiFFPjhiTN6Q==", + "version": "66.5.2", + "resolved": "https://registry.npmjs.org/@unocss/transformer-compile-class/-/transformer-compile-class-66.5.2.tgz", + "integrity": "sha512-50UTeKH6zycAzF44+6eCW13uPy5bw3W3Z8miEAIj0cNaKHTul0QYQFhLT3R804cnkAdX/Cp6IE/HSivxeP5ueQ==", "dev": true, "license": "MIT", "dependencies": { - "@unocss/core": "66.5.1" + "@unocss/core": "66.5.2" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@unocss/transformer-directives": { - "version": "66.5.1", - "resolved": "https://registry.npmjs.org/@unocss/transformer-directives/-/transformer-directives-66.5.1.tgz", - "integrity": "sha512-+SErDMglrTI3NTaY8GYh2fCalXNIQDahf7b2AaBCiOf+SPPXeicIy04/1nx8cJ/qpsJ4Z4+ZBybFlATVSkInyQ==", + "version": "66.5.2", + "resolved": "https://registry.npmjs.org/@unocss/transformer-directives/-/transformer-directives-66.5.2.tgz", + "integrity": "sha512-hwbAdV1Vr001ojaXR8rVt4jJvPnrAjl9h2SQWjaqyGkLntnKvFB8JSTS9CT0cyv1GrwiBAwdnVIdioLAQ3GPbg==", "dev": true, "license": "MIT", "dependencies": { - "@unocss/core": "66.5.1", - "@unocss/rule-utils": "66.5.1", + "@unocss/core": "66.5.2", + "@unocss/rule-utils": "66.5.2", "css-tree": "^3.1.0" } }, "node_modules/@unocss/transformer-variant-group": { - "version": "66.5.1", - "resolved": "https://registry.npmjs.org/@unocss/transformer-variant-group/-/transformer-variant-group-66.5.1.tgz", - "integrity": "sha512-ykUIXExfSCrmex0f8OvS4hYZ4M0EbinosW86xLKwc2GGcbWD6CwqyxxpVWgXSzcc2sIELuqF+K3oZnIlQt3Dug==", + "version": "66.5.2", + "resolved": "https://registry.npmjs.org/@unocss/transformer-variant-group/-/transformer-variant-group-66.5.2.tgz", + "integrity": "sha512-ZgH4hgoIbbh92pszsT2M93e/DcEmN+s9yjYPPCa0qxvTQb6aANM02Z6T7OE0ltQ0NShELfIS4oSGUKY6ezHwug==", "dev": true, "license": "MIT", "dependencies": { - "@unocss/core": "66.5.1" + "@unocss/core": "66.5.2" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@unocss/vite": { - "version": "66.5.1", - "resolved": "https://registry.npmjs.org/@unocss/vite/-/vite-66.5.1.tgz", - "integrity": "sha512-qcZMh+SZbKYfTjJC2CP6B9Zxg0jlfhJSDVmXdjQBlUzhQR9FllnwlBdae6SCVFBc634Sm+pBJIri5ShPLvwq+Q==", + "version": "66.5.2", + "resolved": "https://registry.npmjs.org/@unocss/vite/-/vite-66.5.2.tgz", + "integrity": "sha512-0OcvZHV7ag8ml9z1pG0T92b81CP8nOv21o9vZnQUJN4Uw+8fnVA9xCh1X68IfDNr5Q8nS5zz/Fjr/pC89Cb+og==", "dev": true, "license": "MIT", "dependencies": { "@jridgewell/remapping": "^2.3.5", - "@unocss/config": "66.5.1", - "@unocss/core": "66.5.1", - "@unocss/inspector": "66.5.1", + "@unocss/config": "66.5.2", + "@unocss/core": "66.5.2", + "@unocss/inspector": "66.5.2", "chokidar": "^3.6.0", "magic-string": "^0.30.18", "pathe": "^2.0.3", @@ -7880,22 +7846,43 @@ } }, "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", "license": "MIT", "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" }, "engines": { "node": ">= 0.6" } }, "node_modules/accepts/node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -8054,26 +8041,26 @@ "license": "MIT" }, "node_modules/algoliasearch": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.37.0.tgz", - "integrity": "sha512-y7gau/ZOQDqoInTQp0IwTOjkrHc4Aq4R8JgpmCleFwiLl+PbN2DMWoDUWZnrK8AhNJwT++dn28Bt4NZYNLAmuA==", + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.38.0.tgz", + "integrity": "sha512-8VJKIzheeI9cjuVJhU1hYEVetOTe7LvA+CujAI7yqvYsPtZfVEvv1pg9AeFNtHBg/ZoSLGU5LPijhcY5l3Ea9g==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/abtesting": "1.3.0", - "@algolia/client-abtesting": "5.37.0", - "@algolia/client-analytics": "5.37.0", - "@algolia/client-common": "5.37.0", - "@algolia/client-insights": "5.37.0", - "@algolia/client-personalization": "5.37.0", - "@algolia/client-query-suggestions": "5.37.0", - "@algolia/client-search": "5.37.0", - "@algolia/ingestion": "1.37.0", - "@algolia/monitoring": "1.37.0", - "@algolia/recommend": "5.37.0", - "@algolia/requester-browser-xhr": "5.37.0", - "@algolia/requester-fetch": "5.37.0", - "@algolia/requester-node-http": "5.37.0" + "@algolia/abtesting": "1.4.0", + "@algolia/client-abtesting": "5.38.0", + "@algolia/client-analytics": "5.38.0", + "@algolia/client-common": "5.38.0", + "@algolia/client-insights": "5.38.0", + "@algolia/client-personalization": "5.38.0", + "@algolia/client-query-suggestions": "5.38.0", + "@algolia/client-search": "5.38.0", + "@algolia/ingestion": "1.38.0", + "@algolia/monitoring": "1.38.0", + "@algolia/recommend": "5.38.0", + "@algolia/requester-browser-xhr": "5.38.0", + "@algolia/requester-fetch": "5.38.0", + "@algolia/requester-node-http": "5.38.0" }, "engines": { "node": ">= 14.0.0" @@ -8236,6 +8223,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true, "license": "MIT" }, "node_modules/array-ify": { @@ -8372,9 +8360,9 @@ } }, "node_modules/axios": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.11.0.tgz", - "integrity": "sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.12.2.tgz", + "integrity": "sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", @@ -8383,11 +8371,19 @@ } }, "node_modules/b4a": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", - "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.2.tgz", + "integrity": "sha512-DyUOdz+E8R6+sruDpQNOaV0y/dBbV6X/8ZkxrDcR0Ifc3BgKlpgG0VAtfOozA0eMtJO5GGe9FsZhueLs00pTww==", "dev": true, - "license": "Apache-2.0" + "license": "Apache-2.0", + "peerDependencies": { + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } + } }, "node_modules/babel-loader": { "version": "10.0.0", @@ -8466,12 +8462,11 @@ "license": "MIT" }, "node_modules/bare-events": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.6.1.tgz", - "integrity": "sha512-AuTJkq9XmE6Vk0FJVNq5QxETrSA/vKHarWVBG5l/JbdCL1prJemiyJqUS0jrlXO0MftuPq4m3YVYhoNc5+aE/g==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.7.0.tgz", + "integrity": "sha512-b3N5eTW1g7vXkw+0CXh/HazGTcO5KYuu/RCNaJbDMPI6LHDi+7qe8EmxKUVe1sUbY2KZOVZFyj62x0OEz9qyAA==", "dev": true, - "license": "Apache-2.0", - "optional": true + "license": "Apache-2.0" }, "node_modules/base64-js": { "version": "1.5.1", @@ -8502,6 +8497,16 @@ "node": "^4.5.0 || >= 5.9" } }, + "node_modules/baseline-browser-mapping": { + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.6.tgz", + "integrity": "sha512-wrH5NNqren/QMtKUEEJf7z86YjfqW/2uw3IL3/xpqZUC95SSVIFXYQeeGjL6FT/X68IROu6RMehZQS5foy2BXw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, "node_modules/bcryptjs": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-3.0.2.tgz", @@ -8568,9 +8573,9 @@ } }, "node_modules/birpc": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.5.0.tgz", - "integrity": "sha512-VSWO/W6nNQdyP520F1mhf+Lc2f8pjGQOtoHHm7Ze8Go1kX7akpVIrtTa0fn+HB0QJEDVacl6aO08YE0PgXfdnQ==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.6.1.tgz", + "integrity": "sha512-LPnFhlDpdSH6FJhJyn4M0kFO7vtQ5iPw24FnG0y21q09xC7e8+1LeR31S1MAIrDAHp4m7aas4bEkTDTvMAtebQ==", "dev": true, "license": "MIT", "funding": { @@ -8596,57 +8601,35 @@ "optional": true }, "node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", + "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.0", + "http-errors": "^2.0.0", + "iconv-lite": "^0.6.3", + "on-finished": "^2.4.1", + "qs": "^6.14.0", + "raw-body": "^3.0.0", + "type-is": "^2.0.0" }, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": ">=18" } }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "license": "MIT", "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/body-parser/node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.6" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.10.0" } }, "node_modules/boxen": { @@ -8821,9 +8804,9 @@ "license": "ISC" }, "node_modules/browserslist": { - "version": "4.25.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.4.tgz", - "integrity": "sha512-4jYpcjabC606xJ3kw2QwGEZKX0Aw7sgQdZCvIK9dhVSPh76BKo+C+btT1RRofH7B+8iNpEbgGNVWiLki5q93yg==", + "version": "4.26.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.2.tgz", + "integrity": "sha512-ECFzp6uFOSB+dcZ5BK/IBaGWssbSYBHvuMeMt3MMFyhI0Z8SqGgEkBLARgpRH3hutIgPVsALcMwbDrJqPxQ65A==", "dev": true, "funding": [ { @@ -8841,9 +8824,10 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001737", - "electron-to-chromium": "^1.5.211", - "node-releases": "^2.0.19", + "baseline-browser-mapping": "^2.8.3", + "caniuse-lite": "^1.0.30001741", + "electron-to-chromium": "^1.5.218", + "node-releases": "^2.0.21", "update-browserslist-db": "^1.1.3" }, "bin": { @@ -9133,9 +9117,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001741", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001741.tgz", - "integrity": "sha512-QGUGitqsc8ARjLdgAfxETDhRbJ0REsP6O3I96TAth/mVjh2cYzN2u+3AzPP3aVSm2FehEItaJw1xd+IGBXWeSw==", + "version": "1.0.30001743", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001743.tgz", + "integrity": "sha512-e6Ojr7RV14Un7dz6ASD0aZDmQPT/A+eZU+nuTNfjqmRrmkmQlnTNWH0SKmqagx9PeW87UVqapSurtAXifmtdmw==", "dev": true, "funding": [ { @@ -9196,9 +9180,9 @@ } }, "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.0.tgz", + "integrity": "sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA==", "license": "MIT" }, "node_modules/chokidar": { @@ -9424,30 +9408,79 @@ "node": ">=8.0.0" } }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/co-body/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "safer-buffer": ">= 2.1.2 < 3" }, "engines": { - "node": ">=7.0.0" + "node": ">=0.10.0" } }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" + "node_modules/co-body/node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true, - "license": "ISC", + "node_modules/co-body/node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/co-body/node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, + "license": "ISC", "bin": { "color-support": "bin.js" } @@ -9721,9 +9754,9 @@ "license": "ISC" }, "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", + "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", "license": "MIT", "dependencies": { "safe-buffer": "5.2.1" @@ -9914,9 +9947,9 @@ "license": "MIT" }, "node_modules/cookie": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -9947,10 +9980,13 @@ } }, "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "license": "MIT" + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } }, "node_modules/cookiejar": { "version": "2.1.4", @@ -10058,10 +10094,6 @@ "buffer": "^5.1.0" } }, - "node_modules/create-feathers": { - "resolved": "packages/create-feathers", - "link": true - }, "node_modules/create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", @@ -10237,9 +10269,9 @@ "license": "MIT" }, "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -10744,16 +10776,16 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.215", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.215.tgz", - "integrity": "sha512-TIvGp57UpeNetj/wV/xpFNpWGb0b/ROw372lHPx5Aafx02gjTBtWnEEcaSX3W2dLM3OSdGGyHX/cHl01JQsLaQ==", + "version": "1.5.223", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.223.tgz", + "integrity": "sha512-qKm55ic6nbEmagFlTFczML33rF90aU+WtrJ9MdTCThrcvDNdUHN4p6QfVN78U06ZmguqXIyMPyYhw2TrbDUwPQ==", "dev": true, "license": "ISC" }, "node_modules/element-plus": { - "version": "2.11.2", - "resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.11.2.tgz", - "integrity": "sha512-sTMDXtgeqy17TUsBSH/DL3h1/5sqIOVUUgXFoVbdD8lWWYssKrDX50CEYy4k29tYJhPHKZyFSwcLJsIajr+dDA==", + "version": "2.11.3", + "resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.11.3.tgz", + "integrity": "sha512-769xsjLR4B9Vf9cl5PDXnwTEdmFJvMgAkYtthdJKPhjVjU3hdAwTJ+gXKiO+PUyo2KWFwOYKZd4Ywh6PHfkbJg==", "license": "MIT", "dependencies": { "@ctrl/tinycolor": "^3.4.1", @@ -11004,11 +11036,15 @@ "node": ">=10.0.0" } }, - "node_modules/engine.io/node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "node_modules/engine.io/node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, "engines": { "node": ">= 0.6" } @@ -11030,6 +11066,15 @@ } } }, + "node_modules/engine.io/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/enhanced-resolve": { "version": "5.18.3", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", @@ -11100,9 +11145,9 @@ "license": "MIT" }, "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -11249,9 +11294,9 @@ } }, "node_modules/esbuild": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.9.tgz", - "integrity": "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.10.tgz", + "integrity": "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==", "hasInstallScript": true, "license": "MIT", "bin": { @@ -11261,32 +11306,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.9", - "@esbuild/android-arm": "0.25.9", - "@esbuild/android-arm64": "0.25.9", - "@esbuild/android-x64": "0.25.9", - "@esbuild/darwin-arm64": "0.25.9", - "@esbuild/darwin-x64": "0.25.9", - "@esbuild/freebsd-arm64": "0.25.9", - "@esbuild/freebsd-x64": "0.25.9", - "@esbuild/linux-arm": "0.25.9", - "@esbuild/linux-arm64": "0.25.9", - "@esbuild/linux-ia32": "0.25.9", - "@esbuild/linux-loong64": "0.25.9", - "@esbuild/linux-mips64el": "0.25.9", - "@esbuild/linux-ppc64": "0.25.9", - "@esbuild/linux-riscv64": "0.25.9", - "@esbuild/linux-s390x": "0.25.9", - "@esbuild/linux-x64": "0.25.9", - "@esbuild/netbsd-arm64": "0.25.9", - "@esbuild/netbsd-x64": "0.25.9", - "@esbuild/openbsd-arm64": "0.25.9", - "@esbuild/openbsd-x64": "0.25.9", - "@esbuild/openharmony-arm64": "0.25.9", - "@esbuild/sunos-x64": "0.25.9", - "@esbuild/win32-arm64": "0.25.9", - "@esbuild/win32-ia32": "0.25.9", - "@esbuild/win32-x64": "0.25.9" + "@esbuild/aix-ppc64": "0.25.10", + "@esbuild/android-arm": "0.25.10", + "@esbuild/android-arm64": "0.25.10", + "@esbuild/android-x64": "0.25.10", + "@esbuild/darwin-arm64": "0.25.10", + "@esbuild/darwin-x64": "0.25.10", + "@esbuild/freebsd-arm64": "0.25.10", + "@esbuild/freebsd-x64": "0.25.10", + "@esbuild/linux-arm": "0.25.10", + "@esbuild/linux-arm64": "0.25.10", + "@esbuild/linux-ia32": "0.25.10", + "@esbuild/linux-loong64": "0.25.10", + "@esbuild/linux-mips64el": "0.25.10", + "@esbuild/linux-ppc64": "0.25.10", + "@esbuild/linux-riscv64": "0.25.10", + "@esbuild/linux-s390x": "0.25.10", + "@esbuild/linux-x64": "0.25.10", + "@esbuild/netbsd-arm64": "0.25.10", + "@esbuild/netbsd-x64": "0.25.10", + "@esbuild/openbsd-arm64": "0.25.10", + "@esbuild/openbsd-x64": "0.25.10", + "@esbuild/openharmony-arm64": "0.25.10", + "@esbuild/sunos-x64": "0.25.10", + "@esbuild/win32-arm64": "0.25.10", + "@esbuild/win32-ia32": "0.25.10", + "@esbuild/win32-x64": "0.25.10" } }, "node_modules/escalade": { @@ -11665,6 +11710,16 @@ "node": ">=0.8.x" } }, + "node_modules/events-universal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", + "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.7.0" + } + }, "node_modules/execa": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz", @@ -11714,79 +11769,66 @@ "license": "Apache-2.0" }, "node_modules/express": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", - "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", + "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", "license": "MIT", "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.12", - "proxy-addr": "~2.0.7", - "qs": "6.13.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" + "accepts": "^2.0.0", + "body-parser": "^2.2.0", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" }, "engines": { - "node": ">= 0.10.0" + "node": ">= 18" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/express" } }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/express/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", "license": "MIT", - "dependencies": { - "ms": "2.0.0" + "engines": { + "node": ">= 0.6" } }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/express/node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "license": "BSD-3-Clause", + "node_modules/express/node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "license": "MIT", "dependencies": { - "side-channel": "^1.0.6" + "mime-db": "^1.54.0" }, "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 0.6" } }, "node_modules/exsolve": { @@ -11796,20 +11838,6 @@ "dev": true, "license": "MIT" }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "license": "MIT", - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -11924,6 +11952,24 @@ "reusify": "^1.0.4" } }, + "node_modules/feathers": { + "version": "6.0.0-pre.2", + "resolved": "https://registry.npmjs.org/feathers/-/feathers-6.0.0-pre.2.tgz", + "integrity": "sha512-63tAlQPXWiWhqIXBM/BsFcbZV/QL61kozGQp2Zngjt3ZPojaEYBzcT3CeboOjfYVKO+dv8bqLFrcjJXo0LZt0Q==", + "license": "MIT", + "dependencies": { + "@types/qs": "^6.14.0", + "events": "^3.3.0", + "qs": "^6.14.0" + }, + "engines": { + "node": ">= 20" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/daffl" + } + }, "node_modules/figures": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", @@ -12019,38 +12065,22 @@ } }, "node_modules/finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", + "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", "license": "MIT", "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" }, "engines": { "node": ">= 0.8" } }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, "node_modules/find-cache-dir": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", @@ -12275,12 +12305,12 @@ } }, "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, "node_modules/front-matter": { @@ -12325,9 +12355,9 @@ "license": "MIT" }, "node_modules/fs-extra": { - "version": "11.3.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.1.tgz", - "integrity": "sha512-eXvGGwZ5CL17ZSwHWd3bbgk7UUpF6IFHtP57NYYakPvHOs8GDgDe5KJI36jIJzDkJ6eJjuzRA8eBQb6SkKue0g==", + "version": "11.3.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", + "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", "dev": true, "license": "MIT", "dependencies": { @@ -13020,26 +13050,6 @@ "jws": "^4.0.0" } }, - "node_modules/grant/node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/grant/node_modules/cookie-signature": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", - "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=6.6.0" - } - }, "node_modules/grant/node_modules/jwa": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", @@ -13464,10 +13474,19 @@ "node": ">= 0.8" } }, - "node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "node_modules/http-errors/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dev": true, "license": "MIT", "dependencies": { @@ -13523,6 +13542,338 @@ "serve": "index.js" } }, + "node_modules/https-localhost/node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/https-localhost/node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/https-localhost/node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/https-localhost/node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/https-localhost/node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/https-localhost/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/https-localhost/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/https-localhost/node_modules/express": { + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.12", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/https-localhost/node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/https-localhost/node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/https-localhost/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/https-localhost/node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/https-localhost/node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/https-localhost/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/https-localhost/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/https-localhost/node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/https-localhost/node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/https-localhost/node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/https-localhost/node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/https-localhost/node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/https-localhost/node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/https-localhost/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/https-localhost/node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/https-proxy-agent": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", @@ -13558,15 +13909,19 @@ } }, "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", + "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", "license": "MIT", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/idb": { @@ -13754,15 +14109,15 @@ } }, "node_modules/inquirer": { - "version": "9.3.7", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.3.7.tgz", - "integrity": "sha512-LJKFHCSeIRq9hanN14IlOtPSTe3lNES7TYDTE2xxdAy1LS5rYphajK1qtwvj3YmQXvvk0U2Vbmcni8P9EIQW9w==", + "version": "9.3.8", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.3.8.tgz", + "integrity": "sha512-pFGGdaHrmRKMh4WoDDSowddgjT1Vkl90atobmTeSmcPGdYiwikch/m/Ef5wRaiamHejtw0cUUMMerzDUXCci2w==", "license": "MIT", "dependencies": { + "@inquirer/external-editor": "^1.0.2", "@inquirer/figures": "^1.0.3", "ansi-escapes": "^4.3.2", "cli-width": "^4.1.0", - "external-editor": "^3.1.0", "mute-stream": "1.0.0", "ora": "^5.4.1", "run-async": "^3.0.0", @@ -14173,9 +14528,9 @@ } }, "node_modules/is-npm": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.0.0.tgz", - "integrity": "sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.1.0.tgz", + "integrity": "sha512-O2z4/kNgyjhQwVR1Wpkbfc19JIhggF97NZNCpWTnjH7kVcZMUrnut9XSN7txI7VdyIYk5ZatOq3zvSuWpU8hoA==", "dev": true, "license": "MIT", "engines": { @@ -14255,6 +14610,12 @@ "node": ">=0.10.0" } }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "license": "MIT" + }, "node_modules/is-regex": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", @@ -14692,9 +15053,9 @@ } }, "node_modules/jiti": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.5.1.tgz", - "integrity": "sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.0.tgz", + "integrity": "sha512-VXe6RjJkBPj0ohtqaO8vSWP3ZhAKo66fKrFNCll4BTcwljPLz03pCbaNKfzGP5MbrCYcbJ7v0nOYYwUzTEIdXQ==", "dev": true, "license": "MIT", "bin": { @@ -15183,6 +15544,22 @@ "zod": "^3.19.1" } }, + "node_modules/koa-body/node_modules/@types/koa": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.15.0.tgz", + "integrity": "sha512-7QFsywoE5URbuVnG3loe03QXuGajrnotr3gQkXcEBShORai23MePfFYdhz90FEtBBpkyIYQbVD+evKtloCgX3g==", + "license": "MIT", + "dependencies": { + "@types/accepts": "*", + "@types/content-disposition": "*", + "@types/cookies": "*", + "@types/http-assert": "*", + "@types/http-errors": "*", + "@types/keygrip": "*", + "@types/koa-compose": "*", + "@types/node": "*" + } + }, "node_modules/koa-compose": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz", @@ -15202,6 +15579,15 @@ "node": ">= 8" } }, + "node_modules/koa-qs/node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/koa-send": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/koa-send/-/koa-send-5.0.1.tgz", @@ -15286,19 +15672,47 @@ "ms": "^2.1.1" } }, - "node_modules/koa/node_modules/media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "node_modules/koa/node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, "engines": { - "node": ">= 0.8" + "node": ">= 0.6" } }, - "node_modules/koa/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "node_modules/koa/node_modules/accepts/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/koa/node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/koa/node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -15316,16 +15730,20 @@ "node": ">= 0.6" } }, - "node_modules/koa/node_modules/type-is": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", - "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "node_modules/koa/node_modules/mime-types/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/koa/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "license": "MIT", - "dependencies": { - "content-type": "^1.0.5", - "media-typer": "^1.1.0", - "mime-types": "^3.0.0" - }, "engines": { "node": ">= 0.6" } @@ -15354,13 +15772,13 @@ } }, "node_modules/lerna": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/lerna/-/lerna-8.2.3.tgz", - "integrity": "sha512-rmuDU+92eWUnnyaPg3Ise339pTxF+r2hu8ky/soCfbGpUoW4kCwsDza3P/LtQJWrKwZWHcosEitfYvxGUWZ16A==", + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/lerna/-/lerna-8.2.4.tgz", + "integrity": "sha512-0gaVWDIVT7fLfprfwpYcQajb7dBJv3EGavjG7zvJ+TmGx3/wovl5GklnSwM2/WeE0Z2wrIz7ndWhBcDUHVjOcQ==", "dev": true, "license": "MIT", "dependencies": { - "@lerna/create": "8.2.3", + "@lerna/create": "8.2.4", "@npmcli/arborist": "7.5.4", "@npmcli/package-json": "5.2.0", "@npmcli/run-script": "8.1.0", @@ -15400,7 +15818,6 @@ "libnpmaccess": "8.0.6", "libnpmpublish": "9.0.9", "load-json-file": "6.2.0", - "lodash": "^4.17.21", "make-dir": "4.0.0", "minimatch": "3.0.5", "multimatch": "5.0.0", @@ -16136,12 +16553,12 @@ "license": "MIT" }, "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, "node_modules/memoize-one": { @@ -16388,10 +16805,13 @@ } }, "node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", "license": "MIT", + "engines": { + "node": ">=18" + }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } @@ -16417,6 +16837,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" @@ -16526,15 +16947,16 @@ } }, "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, "license": "MIT", "bin": { "mime": "cli.js" }, "engines": { - "node": ">=4" + "node": ">=4.0.0" } }, "node_modules/mime-db": { @@ -16789,9 +17211,9 @@ } }, "node_modules/minisearch": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-7.1.2.tgz", - "integrity": "sha512-R1Pd9eF+MD5JYDDSPAp/q1ougKglm14uEkPMvQ/05RGmx6G9wvmLTrTI/Q5iPNJLYqNdsDQ7qTGIcNWR+FrHmA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-7.2.0.tgz", + "integrity": "sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg==", "dev": true, "license": "MIT" }, @@ -16944,14 +17366,14 @@ } }, "node_modules/mongodb": { - "version": "6.19.0", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.19.0.tgz", - "integrity": "sha512-H3GtYujOJdeKIMLKBT9PwlDhGrQfplABNF1G904w6r5ZXKWyv77aB0X9B+rhmaAwjtllHzaEkvi9mkGVZxs2Bw==", + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.20.0.tgz", + "integrity": "sha512-Tl6MEIU3K4Rq3TSHd+sZQqRBoGlFsOgNrH5ltAcFBV62Re3Fd+FcaVf8uSEQFOJ51SDowDVttBTONMfoYWrWlQ==", "license": "Apache-2.0", "dependencies": { - "@mongodb-js/saslprep": "^1.1.9", + "@mongodb-js/saslprep": "^1.3.0", "bson": "^6.10.4", - "mongodb-connection-string-url": "^3.0.0" + "mongodb-connection-string-url": "^3.0.2" }, "engines": { "node": ">=16.20.1" @@ -17034,14 +17456,14 @@ } }, "node_modules/mongodb-memory-server": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/mongodb-memory-server/-/mongodb-memory-server-10.2.0.tgz", - "integrity": "sha512-FG4OVoXjBHC7f8Mdyj1TZ6JyTtMex+qniEzoY1Rsuo/FvHSOHYzGYVbuElamjHuam+HLxWTWEpc43fqke8WNGw==", + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/mongodb-memory-server/-/mongodb-memory-server-10.2.1.tgz", + "integrity": "sha512-wvPofpRZHB4dGwHFplhKYYTwujrcAA0WbIXFNld5hNM6Y+yZWPP5uS8Tw54rOGx9gfr8qwGbDVy9vdNcMG+o+w==", "dev": true, "hasInstallScript": true, "license": "MIT", "dependencies": { - "mongodb-memory-server-core": "10.2.0", + "mongodb-memory-server-core": "10.2.1", "tslib": "^2.8.1" }, "engines": { @@ -17049,9 +17471,9 @@ } }, "node_modules/mongodb-memory-server-core": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/mongodb-memory-server-core/-/mongodb-memory-server-core-10.2.0.tgz", - "integrity": "sha512-IsgWlsXdZxbMNoa3hqazMQ/QeMazEztMBr/fK6OrHefJLlZtCEtIIYoAKJDYDQjcwId0CRkW3WRy05WEuyClDg==", + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/mongodb-memory-server-core/-/mongodb-memory-server-core-10.2.1.tgz", + "integrity": "sha512-vXMZkwV2wj0a8GtewgXJdX5Kh6BfPDJDLxhg5IKuFB4IOW7Qr2+oviODkf2FM3nEpj/E6krXq2SvDrJmnWOigQ==", "dev": true, "license": "MIT", "dependencies": { @@ -17438,9 +17860,9 @@ "license": "MIT" }, "node_modules/node-releases": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.20.tgz", - "integrity": "sha512-7gK6zSXEH6neM212JgfYFXe+GmZQM+fia5SsusuBIUgnPheLFBmIPhtFoAQRj8/7wASYQnbDlHPVwY0BefoFgA==", + "version": "2.0.21", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.21.tgz", + "integrity": "sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==", "dev": true, "license": "MIT" }, @@ -17486,9 +17908,9 @@ } }, "node_modules/normalize-url": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.2.tgz", - "integrity": "sha512-Ee/R3SyN4BuynXcnTaekmaVdbDAEiNrHqjQIA37mHU8G9pf7aaAD4ZX3XjBLo6rsdcxA/gtkcNYZLt30ACgynw==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.1.0.tgz", + "integrity": "sha512-X06Mfd/5aKsRHc0O0J5CUedwnPmnDtLF2+nq+KN9KSDlJHkPuh0JUviWjEWMe0SW/9TDdSLVPuk7L5gGTIA1/w==", "dev": true, "license": "MIT", "engines": { @@ -18717,16 +19139,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/nx/node_modules/tmp": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", - "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.14" - } - }, "node_modules/oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", @@ -18959,15 +19371,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/own-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", @@ -19365,10 +19768,14 @@ } }, "node_modules/path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", - "license": "MIT" + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", + "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } }, "node_modules/path-type": { "version": "4.0.0", @@ -19724,9 +20131,9 @@ } }, "node_modules/preact": { - "version": "10.27.1", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.27.1.tgz", - "integrity": "sha512-V79raXEWch/rbqoNc7nT9E4ep7lu+mI3+sBmfRD4i1M73R3WLYcCtdI0ibxGVf4eQL8ZIz2nFacqEC+rmnOORQ==", + "version": "10.27.2", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.27.2.tgz", + "integrity": "sha512-5SYSgFKSyhCbk6SrXyMpqjb5+MQBgfvEKE/OC+PujcY34sOpqtr+0AZQtPYx5IA6VxynQ7rUPCtKzyovpj9Bpg==", "dev": true, "license": "MIT", "funding": { @@ -19762,9 +20169,9 @@ } }, "node_modules/prebuild-install/node_modules/detect-libc": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", - "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.1.tgz", + "integrity": "sha512-ecqj/sy1jcK1uWrwpR67UhYrIFQ+5WlGxth34WquCbamhFA6hkkwiu37o6J5xCHdo1oixJRfVRw+ywV+Hq/0Aw==", "dev": true, "license": "Apache-2.0", "engines": { @@ -20026,9 +20433,9 @@ } }, "node_modules/pupa": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.1.0.tgz", - "integrity": "sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.3.0.tgz", + "integrity": "sha512-LjgDO2zPtoXP2wJpDjZrGdojii1uqO0cnwKoIoUzkfS98HDmbeiGmYiXo3lXeFlq2xvne1QFQhwYXSUCLKtEuA==", "dev": true, "license": "MIT", "dependencies": { @@ -20074,9 +20481,9 @@ "license": "MIT" }, "node_modules/query-string": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-9.3.0.tgz", - "integrity": "sha512-IQHOQ9aauHAApwAaUYifpEyLHv6fpVGVkMOnwPzcDScLjbLj8tLsILn6unSW79NafOw1llh8oK7Gd0VwmXBFmA==", + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-9.3.1.tgz", + "integrity": "sha512-5fBfMOcDi5SA9qj5jZhWAcTtDfKF5WFdd2uD9nVNlbxVv1baq65aALy6qofpNEGELHvisjjasxQp7BlM9gvMzw==", "license": "MIT", "dependencies": { "decode-uri-component": "^0.4.1", @@ -20141,18 +20548,18 @@ } }, "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.1.tgz", + "integrity": "sha512-9G8cA+tuMS75+6G/TzW8OtLzmBDMo8p1JRxN5AZ+LAp8uxGA8V8GZm4GQ4/N5QNQEnLmg6SS7wyuSmbKepiKqA==", "license": "MIT", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", - "iconv-lite": "0.4.24", + "iconv-lite": "0.7.0", "unpipe": "1.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">= 0.10" } }, "node_modules/rc": { @@ -20574,9 +20981,9 @@ "license": "MIT" }, "node_modules/regenerate-unicode-properties": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", - "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", + "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", "dev": true, "license": "MIT", "dependencies": { @@ -20632,18 +21039,18 @@ } }, "node_modules/regexpu-core": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", - "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", + "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", "dev": true, "license": "MIT", "dependencies": { "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.2.0", + "regenerate-unicode-properties": "^10.2.2", "regjsgen": "^0.8.0", - "regjsparser": "^0.12.0", + "regjsparser": "^0.13.0", "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" + "unicode-match-property-value-ecmascript": "^2.2.1" }, "engines": { "node": ">=4" @@ -20686,31 +21093,18 @@ "license": "MIT" }, "node_modules/regjsparser": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", - "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.0.tgz", + "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "jsesc": "~3.0.2" + "jsesc": "~3.1.0" }, "bin": { "regjsparser": "bin/parser" } }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/remote-git-tags": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/remote-git-tags/-/remote-git-tags-3.0.0.tgz", @@ -21037,9 +21431,9 @@ } }, "node_modules/rollup": { - "version": "4.50.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.50.1.tgz", - "integrity": "sha512-78E9voJHwnXQMiQdiqswVLZwJIzdBKJ1GdI5Zx6XwoFKUIk09/sSrr+05QFzvYb8q6Y9pPV45zzDuYa3907TZA==", + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.2.tgz", + "integrity": "sha512-I25/2QgoROE1vYV+NQ1En9T9UFB9Cmfm2CJ83zZOlaDpvz29wGQSZXWKw7MiNXau7wYgB/T9fVIdIuEQ+KbiiA==", "dev": true, "license": "MIT", "dependencies": { @@ -21053,30 +21447,47 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.50.1", - "@rollup/rollup-android-arm64": "4.50.1", - "@rollup/rollup-darwin-arm64": "4.50.1", - "@rollup/rollup-darwin-x64": "4.50.1", - "@rollup/rollup-freebsd-arm64": "4.50.1", - "@rollup/rollup-freebsd-x64": "4.50.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.50.1", - "@rollup/rollup-linux-arm-musleabihf": "4.50.1", - "@rollup/rollup-linux-arm64-gnu": "4.50.1", - "@rollup/rollup-linux-arm64-musl": "4.50.1", - "@rollup/rollup-linux-loongarch64-gnu": "4.50.1", - "@rollup/rollup-linux-ppc64-gnu": "4.50.1", - "@rollup/rollup-linux-riscv64-gnu": "4.50.1", - "@rollup/rollup-linux-riscv64-musl": "4.50.1", - "@rollup/rollup-linux-s390x-gnu": "4.50.1", - "@rollup/rollup-linux-x64-gnu": "4.50.1", - "@rollup/rollup-linux-x64-musl": "4.50.1", - "@rollup/rollup-openharmony-arm64": "4.50.1", - "@rollup/rollup-win32-arm64-msvc": "4.50.1", - "@rollup/rollup-win32-ia32-msvc": "4.50.1", - "@rollup/rollup-win32-x64-msvc": "4.50.1", + "@rollup/rollup-android-arm-eabi": "4.52.2", + "@rollup/rollup-android-arm64": "4.52.2", + "@rollup/rollup-darwin-arm64": "4.52.2", + "@rollup/rollup-darwin-x64": "4.52.2", + "@rollup/rollup-freebsd-arm64": "4.52.2", + "@rollup/rollup-freebsd-x64": "4.52.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.52.2", + "@rollup/rollup-linux-arm-musleabihf": "4.52.2", + "@rollup/rollup-linux-arm64-gnu": "4.52.2", + "@rollup/rollup-linux-arm64-musl": "4.52.2", + "@rollup/rollup-linux-loong64-gnu": "4.52.2", + "@rollup/rollup-linux-ppc64-gnu": "4.52.2", + "@rollup/rollup-linux-riscv64-gnu": "4.52.2", + "@rollup/rollup-linux-riscv64-musl": "4.52.2", + "@rollup/rollup-linux-s390x-gnu": "4.52.2", + "@rollup/rollup-linux-x64-gnu": "4.52.2", + "@rollup/rollup-linux-x64-musl": "4.52.2", + "@rollup/rollup-openharmony-arm64": "4.52.2", + "@rollup/rollup-win32-arm64-msvc": "4.52.2", + "@rollup/rollup-win32-ia32-msvc": "4.52.2", + "@rollup/rollup-win32-x64-gnu": "4.52.2", + "@rollup/rollup-win32-x64-msvc": "4.52.2", "fsevents": "~2.3.2" } }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, "node_modules/run-applescript": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", @@ -21228,9 +21639,9 @@ "license": "MIT" }, "node_modules/sass": { - "version": "1.92.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.92.1.tgz", - "integrity": "sha512-ffmsdbwqb3XeyR8jJR6KelIXARM9bFQe8A6Q3W4Klmwy5Ckd5gz7jgUNHo4UOqutU5Sk1DtKLbpDP0nLCg1xqQ==", + "version": "1.93.2", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.93.2.tgz", + "integrity": "sha512-t+YPtOQHpGW1QWsh1CHQ5cPIr9lbbGZLZnbihP/D/qZj/yuV68m8qarcV17nvkOX81BCrvzAlq2klCQFZghyTg==", "dev": true, "license": "MIT", "dependencies": { @@ -21388,51 +21799,46 @@ "license": "APACHEv2" }, "node_modules/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", + "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", "license": "MIT", "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" + "debug": "^4.3.5", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "mime-types": "^3.0.1", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 18" } }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/send/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", "license": "MIT", - "dependencies": { - "ms": "2.0.0" + "engines": { + "node": ">= 0.6" } }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/send/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "node_modules/send/node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, "engines": { - "node": ">= 0.8" + "node": ">= 0.6" } }, "node_modules/serialize-javascript": { @@ -21446,18 +21852,18 @@ } }, "node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", "license": "MIT", "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 18" } }, "node_modules/set-blocking": { @@ -21713,17 +22119,17 @@ } }, "node_modules/shiki": { - "version": "3.12.2", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-3.12.2.tgz", - "integrity": "sha512-uIrKI+f9IPz1zDT+GMz+0RjzKJiijVr6WDWm9Pe3NNY6QigKCfifCEv9v9R2mDASKKjzjQ2QpFLcxaR3iHSnMA==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-3.13.0.tgz", + "integrity": "sha512-aZW4l8Og16CokuCLf8CF8kq+KK2yOygapU5m3+hoGw0Mdosc6fPitjM+ujYarppj5ZIKGyPDPP1vqmQhr+5/0g==", "license": "MIT", "dependencies": { - "@shikijs/core": "3.12.2", - "@shikijs/engine-javascript": "3.12.2", - "@shikijs/engine-oniguruma": "3.12.2", - "@shikijs/langs": "3.12.2", - "@shikijs/themes": "3.12.2", - "@shikijs/types": "3.12.2", + "@shikijs/core": "3.13.0", + "@shikijs/engine-javascript": "3.13.0", + "@shikijs/engine-oniguruma": "3.13.0", + "@shikijs/langs": "3.13.0", + "@shikijs/themes": "3.13.0", + "@shikijs/types": "3.13.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } @@ -22094,6 +22500,19 @@ } } }, + "node_modules/socket.io/node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/socket.io/node_modules/debug": { "version": "4.3.7", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", @@ -22111,6 +22530,15 @@ } } }, + "node_modules/socket.io/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/socks": { "version": "2.8.7", "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", @@ -22764,9 +23192,9 @@ } }, "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -22787,17 +23215,15 @@ } }, "node_modules/streamx": { - "version": "2.22.1", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.1.tgz", - "integrity": "sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA==", + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz", + "integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==", "dev": true, "license": "MIT", "dependencies": { + "events-universal": "^1.0.0", "fast-fifo": "^1.3.2", "text-decoder": "^1.1.0" - }, - "optionalDependencies": { - "bare-events": "^2.2.0" } }, "node_modules/string_decoder": { @@ -23116,19 +23542,6 @@ "url": "https://ko-fi.com/tunnckoCore/commissions" } }, - "node_modules/superagent/node_modules/mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "dev": true, - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/superjson": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.2.tgz", @@ -23223,9 +23636,9 @@ } }, "node_modules/tar-fs": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.3.tgz", - "integrity": "sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", + "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", "dev": true, "license": "MIT", "dependencies": { @@ -23532,9 +23945,9 @@ } }, "node_modules/terser-webpack-plugin/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.30", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz", - "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==", + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, "license": "MIT", "dependencies": { @@ -23754,35 +24167,33 @@ } }, "node_modules/tldts": { - "version": "7.0.13", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.13.tgz", - "integrity": "sha512-z/SgnxiICGb7Gli0z7ci9BZdjy1tQORUbdmzEUA7NbIJKWhdONn78Ji8gV0PAGfHPyEd+I+W2rMzhLjWkv2Olg==", + "version": "7.0.16", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.16.tgz", + "integrity": "sha512-5bdPHSwbKTeHmXrgecID4Ljff8rQjv7g8zKQPkCozRo2HWWni+p310FSn5ImI+9kWw9kK4lzOB5q/a6iv0IJsw==", "dev": true, "license": "MIT", "dependencies": { - "tldts-core": "^7.0.13" + "tldts-core": "^7.0.16" }, "bin": { "tldts": "bin/cli.js" } }, "node_modules/tldts-core": { - "version": "7.0.13", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.13.tgz", - "integrity": "sha512-Td0LeWLgXJGsikI4mO82fRexgPCEyTcwWiXJERF/GBHX3Dm+HQq/wx4HnYowCbiwQ8d+ENLZc+ktbZw8H+0oEA==", + "version": "7.0.16", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.16.tgz", + "integrity": "sha512-XHhPmHxphLi+LGbH0G/O7dmUH9V65OY20R7vH8gETHsp5AZCjBk9l8sqmRKLaGOxnETU7XNSDUPtewAy/K6jbA==", "dev": true, "license": "MIT" }, "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", + "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", + "dev": true, "license": "MIT", - "dependencies": { - "os-tmpdir": "~1.0.2" - }, "engines": { - "node": ">=0.6.0" + "node": ">=14.14" } }, "node_modules/to-regex-range": { @@ -24118,18 +24529,47 @@ } }, "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", "license": "MIT", "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" }, "engines": { "node": ">= 0.6" } }, + "node_modules/typebox": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/typebox/-/typebox-1.0.15.tgz", + "integrity": "sha512-MOLQPGYtiNQMVklXSg2soH+LLKP83HpoX5MylJpmJMiWKhIeWypufJhhGomxzVIdvUNA3bcRRr/x0eYUzPApMQ==", + "dev": true, + "license": "MIT" + }, "node_modules/typed-array-buffer": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", @@ -24302,9 +24742,9 @@ } }, "node_modules/undici-types": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz", - "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==", + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.12.0.tgz", + "integrity": "sha512-goOacqME2GYyOZZfb5Lgtu+1IDmAlAEu5xnD3+xTzS10hT0vzpf0SPjkXwAw9Jm+4n/mQGDP3LO8CPbYROeBfQ==", "license": "MIT" }, "node_modules/unicode-canonical-property-names-ecmascript": { @@ -24342,9 +24782,9 @@ } }, "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", + "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", "dev": true, "license": "MIT", "engines": { @@ -24352,26 +24792,26 @@ } }, "node_modules/unimport": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/unimport/-/unimport-5.2.0.tgz", - "integrity": "sha512-bTuAMMOOqIAyjV4i4UH7P07pO+EsVxmhOzQ2YJ290J6mkLUdozNhb5I/YoOEheeNADC03ent3Qj07X0fWfUpmw==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/unimport/-/unimport-5.4.0.tgz", + "integrity": "sha512-g/OLFZR2mEfqbC6NC9b2225eCJGvufxq34mj6kM3OmI5gdSL0qyqtnv+9qmsGpAmnzSl6x0IWZj4W+8j2hLkMA==", "dev": true, "license": "MIT", "dependencies": { "acorn": "^8.15.0", "escape-string-regexp": "^5.0.0", "estree-walker": "^3.0.3", - "local-pkg": "^1.1.1", - "magic-string": "^0.30.17", - "mlly": "^1.7.4", + "local-pkg": "^1.1.2", + "magic-string": "^0.30.19", + "mlly": "^1.8.0", "pathe": "^2.0.3", "picomatch": "^4.0.3", - "pkg-types": "^2.2.0", + "pkg-types": "^2.3.0", "scule": "^1.3.0", "strip-literal": "^3.0.0", - "tinyglobby": "^0.2.14", - "unplugin": "^2.3.5", - "unplugin-utils": "^0.2.4" + "tinyglobby": "^0.2.15", + "unplugin": "^2.3.10", + "unplugin-utils": "^0.3.0" }, "engines": { "node": ">=18.12.0" @@ -24438,23 +24878,6 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/unimport/node_modules/unplugin-utils": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/unplugin-utils/-/unplugin-utils-0.2.5.tgz", - "integrity": "sha512-gwXJnPRewT4rT7sBi/IvxKTjsms7jX7QIDLOClApuZwR49SXbrB1z2NLUZ+vDHyqCj/n58OzRRqaW+B8OZi8vg==", - "dev": true, - "license": "MIT", - "dependencies": { - "pathe": "^2.0.3", - "picomatch": "^4.0.3" - }, - "engines": { - "node": ">=18.12.0" - }, - "funding": { - "url": "https://github.com/sponsors/sxzz" - } - }, "node_modules/unique-filename": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", @@ -24583,31 +25006,31 @@ } }, "node_modules/unocss": { - "version": "66.5.1", - "resolved": "https://registry.npmjs.org/unocss/-/unocss-66.5.1.tgz", - "integrity": "sha512-e+9nqOy9v6NwPz0DxFdApGPefW22pCfU0Z1ALuodEoSHen03WlfTuEhkDkcKEpdo78tbIi/BbAYK9qT8p1d9sg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@unocss/astro": "66.5.1", - "@unocss/cli": "66.5.1", - "@unocss/core": "66.5.1", - "@unocss/postcss": "66.5.1", - "@unocss/preset-attributify": "66.5.1", - "@unocss/preset-icons": "66.5.1", - "@unocss/preset-mini": "66.5.1", - "@unocss/preset-tagify": "66.5.1", - "@unocss/preset-typography": "66.5.1", - "@unocss/preset-uno": "66.5.1", - "@unocss/preset-web-fonts": "66.5.1", - "@unocss/preset-wind": "66.5.1", - "@unocss/preset-wind3": "66.5.1", - "@unocss/preset-wind4": "66.5.1", - "@unocss/transformer-attributify-jsx": "66.5.1", - "@unocss/transformer-compile-class": "66.5.1", - "@unocss/transformer-directives": "66.5.1", - "@unocss/transformer-variant-group": "66.5.1", - "@unocss/vite": "66.5.1" + "version": "66.5.2", + "resolved": "https://registry.npmjs.org/unocss/-/unocss-66.5.2.tgz", + "integrity": "sha512-GCFq6ilalDE33dbjZKgeBHgKGLL/t87XM5sS0aqhD0RgzHhbT2f6Jtsmmg2Q3GASlk5uvJLxh9ifUvPQ13BdyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@unocss/astro": "66.5.2", + "@unocss/cli": "66.5.2", + "@unocss/core": "66.5.2", + "@unocss/postcss": "66.5.2", + "@unocss/preset-attributify": "66.5.2", + "@unocss/preset-icons": "66.5.2", + "@unocss/preset-mini": "66.5.2", + "@unocss/preset-tagify": "66.5.2", + "@unocss/preset-typography": "66.5.2", + "@unocss/preset-uno": "66.5.2", + "@unocss/preset-web-fonts": "66.5.2", + "@unocss/preset-wind": "66.5.2", + "@unocss/preset-wind3": "66.5.2", + "@unocss/preset-wind4": "66.5.2", + "@unocss/transformer-attributify-jsx": "66.5.2", + "@unocss/transformer-compile-class": "66.5.2", + "@unocss/transformer-directives": "66.5.2", + "@unocss/transformer-variant-group": "66.5.2", + "@unocss/vite": "66.5.2" }, "engines": { "node": ">=14" @@ -24616,7 +25039,7 @@ "url": "https://github.com/sponsors/antfu" }, "peerDependencies": { - "@unocss/webpack": "66.5.1", + "@unocss/webpack": "66.5.2", "vite": "^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0" }, "peerDependenciesMeta": { @@ -24654,17 +25077,17 @@ } }, "node_modules/unplugin-auto-import": { - "version": "20.1.0", - "resolved": "https://registry.npmjs.org/unplugin-auto-import/-/unplugin-auto-import-20.1.0.tgz", - "integrity": "sha512-Wa7/y3DwpbxhjyXCbuliuATCPa0/e47tstWkytJGAr55ooSNwIvbkrq0rlduqYGiCNMsZcD+C6vsN+W3AX96eA==", + "version": "20.2.0", + "resolved": "https://registry.npmjs.org/unplugin-auto-import/-/unplugin-auto-import-20.2.0.tgz", + "integrity": "sha512-vfBI/SvD9hJqYNinipVOAj5n8dS8DJXFlCKFR5iLDp2SaQwsfdnfLXgZ+34Kd3YY3YEY9omk8XQg0bwos3Q8ug==", "dev": true, "license": "MIT", "dependencies": { "local-pkg": "^1.1.2", - "magic-string": "^0.30.18", + "magic-string": "^0.30.19", "picomatch": "^4.0.3", - "unimport": "^5.2.0", - "unplugin": "^2.3.8", + "unimport": "^5.4.0", + "unplugin": "^2.3.10", "unplugin-utils": "^0.3.0" }, "engines": { @@ -24730,20 +25153,20 @@ } }, "node_modules/unplugin-vue-components": { - "version": "29.0.0", - "resolved": "https://registry.npmjs.org/unplugin-vue-components/-/unplugin-vue-components-29.0.0.tgz", - "integrity": "sha512-M2DX44g4/jvBkB0V6uwqTbkTd5DMRHpeGoi/cIKwGG4HPuNxLbe8zoTStB2n12hoDiWc9I1PIRQruRWExNXHlQ==", + "version": "29.1.0", + "resolved": "https://registry.npmjs.org/unplugin-vue-components/-/unplugin-vue-components-29.1.0.tgz", + "integrity": "sha512-z/9ACPXth199s9aCTCdKZAhe5QGOpvzJYP+Hkd0GN1/PpAmsu+W3UlRY3BJAewPqQxh5xi56+Og6mfiCV1Jzpg==", "dev": true, "license": "MIT", "dependencies": { "chokidar": "^3.6.0", - "debug": "^4.4.1", - "local-pkg": "^1.1.1", - "magic-string": "^0.30.17", - "mlly": "^1.7.4", - "tinyglobby": "^0.2.14", - "unplugin": "^2.3.5", - "unplugin-utils": "^0.2.4" + "debug": "^4.4.3", + "local-pkg": "^1.1.2", + "magic-string": "^0.30.19", + "mlly": "^1.8.0", + "tinyglobby": "^0.2.15", + "unplugin": "^2.3.10", + "unplugin-utils": "^0.3.0" }, "engines": { "node": ">=14" @@ -24864,36 +25287,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/unplugin-vue-components/node_modules/unplugin-utils": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/unplugin-utils/-/unplugin-utils-0.2.5.tgz", - "integrity": "sha512-gwXJnPRewT4rT7sBi/IvxKTjsms7jX7QIDLOClApuZwR49SXbrB1z2NLUZ+vDHyqCj/n58OzRRqaW+B8OZi8vg==", - "dev": true, - "license": "MIT", - "dependencies": { - "pathe": "^2.0.3", - "picomatch": "^4.0.3" - }, - "engines": { - "node": ">=18.12.0" - }, - "funding": { - "url": "https://github.com/sponsors/sxzz" - } - }, - "node_modules/unplugin-vue-components/node_modules/unplugin-utils/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/unplugin/node_modules/picomatch": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", @@ -25008,6 +25401,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4.0" @@ -25050,9 +25444,9 @@ } }, "node_modules/v8-to-istanbul/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.30", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz", - "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==", + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, "license": "MIT", "dependencies": { @@ -26893,9 +27287,9 @@ } }, "node_modules/workerpool": { - "version": "9.3.3", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-9.3.3.tgz", - "integrity": "sha512-slxCaKbYjEdFT/o2rH9xS1hf4uRDch1w7Uo+apxhZ+sf/1d9e0ZVkn42kPNGP2dgjIx6YFvSevj0zHvbWe2jdw==", + "version": "9.3.4", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-9.3.4.tgz", + "integrity": "sha512-TmPRQYYSAnnDiEB0P/Ytip7bFGvqnSU6I2BcuSw7Hx+JSg/DsUi5ebYfc8GYaSdpuvOcEs6dXxPurOYpe9QFwg==", "dev": true, "license": "Apache-2.0" }, @@ -27363,7 +27757,7 @@ "typescript": "^5.9.2" }, "engines": { - "node": ">= 12" + "node": ">= 20" }, "funding": { "type": "opencollective", @@ -27383,7 +27777,7 @@ "typescript": "^5.9.2" }, "engines": { - "node": ">= 12" + "node": ">= 20" }, "funding": { "type": "opencollective", @@ -27398,14 +27792,14 @@ "@feathersjs/commons": "^5.0.35", "@feathersjs/errors": "^5.0.35", "@feathersjs/feathers": "^5.0.35", - "@feathersjs/hooks": "^0.9.0", + "@feathersjs/hooks": "^5.0.35", "@feathersjs/schema": "^5.0.35", "@feathersjs/transport-commons": "^5.0.35", "@types/jsonwebtoken": "^9.0.10", "jsonwebtoken": "^9.0.2", - "lodash": "^4.17.21", + "lodash-es": "^4.17.21", "long-timeout": "^0.1.1", - "uuid": "^11.1.0" + "uuid": "^13.0.0" }, "devDependencies": { "@feathersjs/memory": "^5.0.35", @@ -27419,7 +27813,7 @@ "typescript": "^5.9.2" }, "engines": { - "node": ">= 12" + "node": ">= 20" }, "funding": { "type": "github", @@ -27452,7 +27846,7 @@ "typescript": "^5.9.2" }, "engines": { - "node": ">= 12" + "node": ">= 20" }, "funding": { "type": "github", @@ -27469,7 +27863,7 @@ "@feathersjs/errors": "^5.0.35", "@feathersjs/feathers": "^5.0.35", "bcryptjs": "^3.0.2", - "lodash": "^4.17.21" + "lodash-es": "^4.17.21" }, "devDependencies": { "@feathersjs/memory": "^5.0.35", @@ -27484,7 +27878,7 @@ "typescript": "^5.9.2" }, "engines": { - "node": ">= 12" + "node": ">= 20" }, "funding": { "type": "github", @@ -27511,7 +27905,6 @@ "devDependencies": { "@feathersjs/memory": "^5.0.35", "@types/cookie-session": "^2.0.49", - "@types/express": "^4.17.21", "@types/koa-session": "^6.4.5", "@types/mocha": "^10.0.10", "@types/node": "^24.3.1", @@ -27524,7 +27917,7 @@ "typescript": "^5.9.2" }, "engines": { - "node": ">= 12" + "node": ">= 20" }, "funding": { "type": "github", @@ -27532,16 +27925,16 @@ } }, "packages/authentication/node_modules/uuid": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", - "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-13.0.0.tgz", + "integrity": "sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], "license": "MIT", "bin": { - "uuid": "dist/esm/bin/uuid" + "uuid": "dist-node/bin/uuid" } }, "packages/cli": { @@ -27551,7 +27944,7 @@ "dependencies": { "@feathersjs/generators": "^5.0.35", "chalk": "^5.6.2", - "commander": "^13.1.0" + "commander": "^14.0.0" }, "bin": { "feathers": "bin/feathers.js" @@ -27585,7 +27978,7 @@ "typescript": "^5.9.2" }, "engines": { - "node": ">= 14" + "node": ">= 20" }, "funding": { "type": "github", @@ -27593,12 +27986,12 @@ } }, "packages/cli/node_modules/commander": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", - "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==", + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.1.tgz", + "integrity": "sha512-2JkV3gUZUVrbNA+1sjBOYLsMZ5cEEl8GTFP2a4AVz5hvasAMCQ1D2l2le/cX+pV4N6ZU17zjUahLpIXRrnWL8A==", "license": "MIT", "engines": { - "node": ">=18" + "node": ">=20" } }, "packages/client": { @@ -27621,7 +28014,6 @@ "@feathersjs/tests": "^5.0.35", "babel-loader": "^10.0.0", "mocha": "^11.7.2", - "node-fetch": "^2.6.1", "shx": "^0.4.0", "socket.io-client": "^4.8.1", "superagent": "^10.2.3", @@ -27632,7 +28024,7 @@ "webpack-merge": "^6.0.1" }, "engines": { - "node": ">= 12" + "node": ">= 20" }, "funding": { "type": "github", @@ -27643,6 +28035,9 @@ "name": "@feathersjs/commons", "version": "5.0.35", "license": "MIT", + "dependencies": { + "feathers": "^6.0.0-pre.2" + }, "devDependencies": { "@types/mocha": "^10.0.10", "@types/node": "^24.3.1", @@ -27652,7 +28047,7 @@ "typescript": "^5.9.2" }, "engines": { - "node": ">= 12" + "node": ">= 20" }, "funding": { "type": "github", @@ -27679,24 +28074,7 @@ "typescript": "^5.9.2" }, "engines": { - "node": ">= 12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/daffl" - } - }, - "packages/create-feathers": { - "version": "5.0.35", - "license": "MIT", - "dependencies": { - "@feathersjs/cli": "^5.0.35" - }, - "bin": { - "create-feathers": "bin/create-feathers.js" - }, - "engines": { - "node": ">= 18" + "node": ">= 20" }, "funding": { "type": "github", @@ -27707,8 +28085,10 @@ "name": "@feathersjs/errors", "version": "5.0.35", "license": "MIT", + "dependencies": { + "feathers": "^6.0.0-pre.2" + }, "devDependencies": { - "@feathersjs/feathers": "^5.0.35", "@types/mocha": "^10.0.10", "@types/node": "^24.3.1", "mocha": "^11.7.2", @@ -27717,7 +28097,7 @@ "typescript": "^5.9.2" }, "engines": { - "node": ">= 12" + "node": ">= 20" } }, "packages/express": { @@ -27732,11 +28112,9 @@ "@feathersjs/transport-commons": "^5.0.35", "@types/compression": "^1.8.1", "@types/cors": "^2.8.19", - "@types/express": "^4.17.21", - "@types/express-serve-static-core": "^4.19.5", "compression": "^1.8.1", "cors": "^2.8.5", - "express": "^4.21.2" + "express": "^5.1.0" }, "devDependencies": { "@feathersjs/authentication-local": "^5.0.35", @@ -27745,14 +28123,14 @@ "@types/mocha": "^10.0.10", "@types/node": "^24.3.1", "axios": "^1.11.0", - "lodash": "^4.17.21", + "lodash-es": "^4.17.21", "mocha": "^11.7.2", "shx": "^0.4.0", "ts-node": "^10.9.2", "typescript": "^5.9.2" }, "engines": { - "node": ">= 12" + "node": ">= 20" }, "funding": { "type": "github", @@ -27764,9 +28142,7 @@ "version": "5.0.35", "license": "MIT", "dependencies": { - "@feathersjs/commons": "^5.0.35", - "@feathersjs/hooks": "^0.9.0", - "events": "^3.3.0" + "feathers": "^6.0.0-pre.2" }, "devDependencies": { "@types/mocha": "^10.0.10", @@ -27777,7 +28153,7 @@ "typescript": "^5.9.2" }, "engines": { - "node": ">= 12" + "node": ">= 20" }, "funding": { "type": "github", @@ -27791,7 +28167,7 @@ "dependencies": { "@featherscloud/pinion": "^0.5.5", "chalk": "^5.6.2", - "lodash": "^4.17.21", + "lodash-es": "^4.17.21", "prettier": "^3.6.2", "typescript": "^5.9.2" }, @@ -27805,6 +28181,7 @@ "@feathersjs/errors": "^5.0.35", "@feathersjs/express": "^5.0.35", "@feathersjs/feathers": "^5.0.35", + "@feathersjs/hooks": "^5.0.35", "@feathersjs/knex": "^5.0.35", "@feathersjs/koa": "^5.0.35", "@feathersjs/mongodb": "^5.0.35", @@ -27827,16 +28204,36 @@ "sqlite3": "^5.1.7", "tsx": "^4.20.5", "type-fest": "^4.41.0", + "typebox": "^1.0.0", "typescript": "^5.9.2" }, "engines": { - "node": ">= 16" + "node": ">= 20" }, "funding": { "type": "github", "url": "https://github.com/sponsors/daffl" } }, + "packages/hooks": { + "name": "@feathersjs/hooks", + "version": "5.0.35", + "license": "MIT", + "dependencies": { + "feathers": "^6.0.0-pre.2" + }, + "devDependencies": { + "@types/mocha": "^10.0.10", + "@types/node": "^24.3.1", + "mocha": "^11.7.2", + "shx": "^0.4.0", + "ts-node": "^10.9.2", + "typescript": "^5.9.2" + }, + "engines": { + "node": ">= 20" + } + }, "packages/knex": { "name": "@feathersjs/knex", "version": "5.0.35", @@ -27860,7 +28257,7 @@ "typescript": "^5.9.2" }, "engines": { - "node": ">= 14" + "node": ">= 20" }, "funding": { "type": "github", @@ -27881,7 +28278,7 @@ "@feathersjs/feathers": "^5.0.35", "@feathersjs/transport-commons": "^5.0.35", "@koa/cors": "^5.0.0", - "@types/koa": "^2.15.0", + "@types/koa": "^3.0.0", "@types/koa__cors": "^5.0.0", "@types/koa-qs": "^2.0.3", "@types/koa-static": "^4.0.4", @@ -27905,23 +28302,7 @@ "typescript": "^5.9.2" }, "engines": { - "node": ">= 14" - } - }, - "packages/koa/node_modules/@types/koa": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/koa/-/koa-3.0.0.tgz", - "integrity": "sha512-MOcVYdVYmkSutVHZZPh8j3+dAjLyR5Tl59CN0eKgpkE1h/LBSmPAsQQuWs+bKu7WtGNn+hKfJH9Gzml+PulmDg==", - "license": "MIT", - "dependencies": { - "@types/accepts": "*", - "@types/content-disposition": "*", - "@types/cookies": "*", - "@types/http-assert": "*", - "@types/http-errors": "^2", - "@types/keygrip": "*", - "@types/koa-compose": "*", - "@types/node": "*" + "node": ">= 20" } }, "packages/memory": { @@ -27945,7 +28326,7 @@ "typescript": "^5.9.2" }, "engines": { - "node": ">= 12" + "node": ">= 20" } }, "packages/mongodb": { @@ -27969,7 +28350,7 @@ "typescript": "^5.9.2" }, "engines": { - "node": ">= 14" + "node": ">= 20" }, "funding": { "type": "github", @@ -27996,11 +28377,9 @@ "@feathersjs/tests": "^5.0.35", "@types/mocha": "^10.0.10", "@types/node": "^24.3.1", - "@types/node-fetch": "^2.6.13", "@types/qs": "^6.14.0", "axios": "^1.11.0", "mocha": "^11.7.2", - "node-fetch": "^2.6.1", "rxjs": "^7.8.2", "shx": "^0.4.0", "superagent": "^10.2.3", @@ -28008,7 +28387,7 @@ "typescript": "^5.9.2" }, "engines": { - "node": ">= 12" + "node": ">= 20" }, "funding": { "type": "github", @@ -28024,7 +28403,7 @@ "@feathersjs/commons": "^5.0.35", "@feathersjs/errors": "^5.0.35", "@feathersjs/feathers": "^5.0.35", - "@feathersjs/hooks": "^0.9.0", + "@feathersjs/hooks": "^5.0.35", "@types/json-schema": "^7.0.15", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", @@ -28040,7 +28419,7 @@ "typescript": "^5.9.2" }, "engines": { - "node": ">= 12" + "node": ">= 20" }, "funding": { "type": "github", @@ -28088,14 +28467,14 @@ "@feathersjs/tests": "^5.0.35", "@types/mocha": "^10.0.10", "@types/node": "^24.3.1", - "lodash": "^4.17.21", + "lodash-es": "^4.17.21", "mocha": "^11.7.2", "shx": "^0.4.0", "socket.io-client": "^4.8.1", "typescript": "^5.9.2" }, "engines": { - "node": ">= 12" + "node": ">= 20" }, "funding": { "type": "github", @@ -28124,7 +28503,7 @@ "typescript": "^5.9.2" }, "engines": { - "node": ">= 12" + "node": ">= 20" }, "funding": { "type": "github", @@ -28138,7 +28517,7 @@ "dependencies": { "@types/lodash": "^4.17.20", "axios": "^1.11.0", - "lodash": "^4.17.21" + "lodash-es": "^4.17.21" }, "devDependencies": { "@feathersjs/feathers": "^5.0.35", @@ -28150,7 +28529,7 @@ "typescript": "^5.9.2" }, "engines": { - "node": ">= 12" + "node": ">= 20" }, "funding": { "type": "github", @@ -28166,7 +28545,7 @@ "@feathersjs/errors": "^5.0.35", "@feathersjs/feathers": "^5.0.35", "encodeurl": "^2.0.0", - "lodash": "^4.17.21" + "lodash-es": "^4.17.21" }, "devDependencies": { "@types/encodeurl": "^1.0.3", @@ -28179,7 +28558,7 @@ "typescript": "^5.9.2" }, "engines": { - "node": ">= 12" + "node": ">= 20" }, "funding": { "type": "github", @@ -28191,29 +28570,26 @@ "version": "5.0.35", "license": "MIT", "dependencies": { - "@feathersjs/schema": "^5.0.35", - "@sinclair/typebox": "^0.25.0" + "@feathersjs/schema": "^5.0.35" }, "devDependencies": { "@types/mocha": "^10.0.10", "@types/node": "^24.3.1", "mocha": "^11.7.2", "shx": "^0.4.0", + "typebox": "^1.0.0", "typescript": "^5.9.2" }, "engines": { - "node": ">= 12" + "node": ">= 20" }, "funding": { "type": "github", "url": "https://github.com/sponsors/daffl" + }, + "peerDependencies": { + "typebox": "^1.0.0" } - }, - "packages/typebox/node_modules/@sinclair/typebox": { - "version": "0.25.24", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", - "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", - "license": "MIT" } } } diff --git a/package.json b/package.json index 97087ef42..6156e687e 100644 --- a/package.json +++ b/package.json @@ -38,9 +38,7 @@ "lint": "npm run prettier && npm run eslint", "compile": "lerna run compile", "build:docs": "npm run build --workspace docs", - "update-dependencies": "npm exec --workspaces --include-workspace-root -- ncu -u --dep prod,dev,optional,peer -x node-fetch,\"@sinclair/typebox\",\"@types/express\",\"@types/express-serve-static-core\",commander,express,flexsearch", - "clean": "find . -name node_modules -exec rm -rf '{}' + && find . -name package-lock.json -exec rm -rf '{}' +", - "test:deno": "deno test --config deno/tsconfig.json deno/test.ts", + "update-dependencies": "npm exec --workspaces --include-workspace-root -- ncu -u --dep prod,dev,optional,peer -x flexsearch", "test": "npm run lint && npm run compile && c8 lerna run test --ignore @feathersjs/tests", "generate:package": "pinion run generators/package.ts" }, @@ -53,6 +51,7 @@ "eslint-config-prettier": "^9.1.0", "eslint-plugin-prettier": "^5.1.3", "lerna": "^8.1.2", + "lodash": "^4.17.21", "npm-check-updates": "^16.14.20", "prettier": "^3.2.5", "typescript": "^5.4.5" diff --git a/packages/adapter-commons/LICENSE b/packages/adapter-commons/LICENSE index 7712f870f..f9b502c69 100644 --- a/packages/adapter-commons/LICENSE +++ b/packages/adapter-commons/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2024 Feathers Contributors +Copyright (c) 2025 Feathers Contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -19,4 +19,3 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - diff --git a/packages/adapter-commons/README.md b/packages/adapter-commons/README.md index 4e9d263c6..201777b75 100644 --- a/packages/adapter-commons/README.md +++ b/packages/adapter-commons/README.md @@ -22,6 +22,6 @@ Refer to the [Feathers database adapter documentation](https://feathersjs.com/ap ## License -Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) +Copyright (c) 2025 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) Licensed under the [MIT license](LICENSE). diff --git a/packages/adapter-commons/package.json b/packages/adapter-commons/package.json index 2f51450c9..23217eef5 100644 --- a/packages/adapter-commons/package.json +++ b/packages/adapter-commons/package.json @@ -7,6 +7,7 @@ "feathers" ], "license": "MIT", + "type": "module", "funding": { "type": "opencollective", "url": "https://opencollective.com/feathers" @@ -26,10 +27,9 @@ "url": "https://github.com/feathersjs/feathers/issues" }, "engines": { - "node": ">= 12" + "node": ">= 20" }, - "main": "lib/", - "types": "lib/", + "main": "lib/index.js", "scripts": { "prepublish": "npm run compile", "pack": "npm pack --pack-destination ../generators/test/build", diff --git a/packages/adapter-commons/src/declarations.ts b/packages/adapter-commons/src/declarations.ts index ce35da3dc..29213201a 100644 --- a/packages/adapter-commons/src/declarations.ts +++ b/packages/adapter-commons/src/declarations.ts @@ -1,5 +1,4 @@ -import { Query, Params, Paginated, Id, PaginationParams, PaginationOptions } from '@feathersjs/feathers' - +import type { Query, Params, Paginated, Id, PaginationParams, PaginationOptions } from '@feathersjs/feathers' export type FilterQueryOptions = { filters?: FilterSettings operators?: string[] diff --git a/packages/adapter-commons/src/index.ts b/packages/adapter-commons/src/index.ts index 8007e44e0..adb97eecf 100644 --- a/packages/adapter-commons/src/index.ts +++ b/packages/adapter-commons/src/index.ts @@ -1,10 +1,9 @@ import { _ } from '@feathersjs/commons' -import { Params } from '@feathersjs/feathers' - -export * from './declarations' -export * from './service' -export * from './query' -export * from './sort' +import type { Params } from '@feathersjs/feathers' +export * from './declarations.js' +export * from './service.js' +export * from './query.js' +export * from './sort.js' // Return a function that filters a result object or array // and picks only the fields passed as `params.query.$select` diff --git a/packages/adapter-commons/src/query.ts b/packages/adapter-commons/src/query.ts index 1dc31ffde..d11ed4303 100644 --- a/packages/adapter-commons/src/query.ts +++ b/packages/adapter-commons/src/query.ts @@ -1,8 +1,7 @@ import { _ } from '@feathersjs/commons' import { BadRequest } from '@feathersjs/errors' -import { Query } from '@feathersjs/feathers' -import { FilterQueryOptions, FilterSettings, PaginationParams } from './declarations' - +import type { Query } from '@feathersjs/feathers' +import type { FilterQueryOptions, FilterSettings, PaginationParams } from './declarations.js' const parse = (value: any) => (typeof value !== 'undefined' ? parseInt(value, 10) : value) const isPlainObject = (value: any) => _.isObject(value) && value.constructor === {}.constructor diff --git a/packages/adapter-commons/src/service.ts b/packages/adapter-commons/src/service.ts index cbaeb3871..a1fc5b877 100644 --- a/packages/adapter-commons/src/service.ts +++ b/packages/adapter-commons/src/service.ts @@ -1,11 +1,11 @@ -import { Id, Paginated, Query } from '@feathersjs/feathers' -import { +import type { Id, Paginated, Query } from '@feathersjs/feathers' +import type { AdapterParams, AdapterServiceOptions, InternalServiceMethods, PaginationOptions -} from './declarations' -import { filterQuery } from './query' +} from './declarations.js' +import { filterQuery } from './query.js' export const VALIDATED = Symbol.for('@feathersjs/adapter/sanitized') diff --git a/packages/adapter-commons/test/commons.test.ts b/packages/adapter-commons/test/commons.test.ts index b0f5eb8d2..dfe5e1eb5 100644 --- a/packages/adapter-commons/test/commons.test.ts +++ b/packages/adapter-commons/test/commons.test.ts @@ -1,5 +1,5 @@ import assert from 'assert' -import { select } from '../src' +import { select } from '../src/index.js' describe('@feathersjs/adapter-commons', () => { describe('select', () => { diff --git a/packages/adapter-commons/test/fixture.ts b/packages/adapter-commons/test/fixture.ts index 43bd667d0..76a39df15 100644 --- a/packages/adapter-commons/test/fixture.ts +++ b/packages/adapter-commons/test/fixture.ts @@ -1,6 +1,7 @@ -import { AdapterBase, AdapterParams, PaginationOptions } from '../src' -import { Id, NullableId, Paginated } from '@feathersjs/feathers' -import { BadRequest, MethodNotAllowed } from '@feathersjs/errors/lib' +import type { AdapterParams, PaginationOptions } from '../src/index.js' +import { AdapterBase } from '../src/index.js' +import type { Id, NullableId, Paginated } from '@feathersjs/feathers' +import { BadRequest, MethodNotAllowed } from '@feathersjs/errors' export type Data = { id: Id diff --git a/packages/adapter-commons/test/query.test.ts b/packages/adapter-commons/test/query.test.ts index 805704c97..0c8fa7837 100644 --- a/packages/adapter-commons/test/query.test.ts +++ b/packages/adapter-commons/test/query.test.ts @@ -1,6 +1,6 @@ import assert from 'assert' import { ObjectId } from 'mongodb' -import { filterQuery } from '../src' +import { filterQuery } from '../src/index.js' describe('@feathersjs/adapter-commons/filterQuery', () => { describe('$sort', () => { diff --git a/packages/adapter-commons/test/service.test.ts b/packages/adapter-commons/test/service.test.ts index ed5cc4a4c..06e7da8b6 100644 --- a/packages/adapter-commons/test/service.test.ts +++ b/packages/adapter-commons/test/service.test.ts @@ -1,7 +1,7 @@ /* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/ban-ts-comment */ import assert from 'assert' -import { VALIDATED } from '../src' -import { MethodService } from './fixture' +import { VALIDATED } from '../src/index.js' +import { MethodService } from './fixture.js' const METHODS: ['find', 'get', 'create', 'update', 'patch', 'remove'] = [ 'find', diff --git a/packages/adapter-commons/test/sort.test.ts b/packages/adapter-commons/test/sort.test.ts index d361c681a..7e47fa5d4 100644 --- a/packages/adapter-commons/test/sort.test.ts +++ b/packages/adapter-commons/test/sort.test.ts @@ -1,5 +1,5 @@ import assert from 'assert' -import { sorter } from '../src' +import { sorter } from '../src/index.js' describe('@feathersjs/adapter-commons', () => { describe('sorter', () => { diff --git a/packages/adapter-tests/LICENSE b/packages/adapter-tests/LICENSE index 7712f870f..f9b502c69 100644 --- a/packages/adapter-tests/LICENSE +++ b/packages/adapter-tests/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2024 Feathers Contributors +Copyright (c) 2025 Feathers Contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -19,4 +19,3 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - diff --git a/packages/adapter-tests/README.md b/packages/adapter-tests/README.md index ebbe6fddc..213a12b73 100644 --- a/packages/adapter-tests/README.md +++ b/packages/adapter-tests/README.md @@ -16,6 +16,6 @@ This is a repository that contains the test suite for the common database adapte ## License -Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) +Copyright (c) 2025 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) Licensed under the [MIT license](LICENSE). diff --git a/packages/adapter-tests/package.json b/packages/adapter-tests/package.json index 71c77eb0e..869ba73de 100644 --- a/packages/adapter-tests/package.json +++ b/packages/adapter-tests/package.json @@ -26,10 +26,10 @@ "url": "https://github.com/feathersjs/feathers/issues" }, "engines": { - "node": ">= 12" + "node": ">= 20" }, - "main": "lib/", - "types": "lib/", + "main": "lib/index.js", + "type": "module", "scripts": { "prepublish": "npm run compile", "pack": "npm pack --pack-destination ../generators/test/build", diff --git a/packages/adapter-tests/src/basic.ts b/packages/adapter-tests/src/basic.ts index c19ad64a7..c22822312 100644 --- a/packages/adapter-tests/src/basic.ts +++ b/packages/adapter-tests/src/basic.ts @@ -1,5 +1,5 @@ import assert from 'assert' -import { AdapterBasicTest } from './declarations' +import { AdapterBasicTest } from './declarations.js' export default (test: AdapterBasicTest, app: any, _errors: any, serviceName: string, idProp: string) => { describe('Basic Functionality', () => { diff --git a/packages/adapter-tests/src/index.ts b/packages/adapter-tests/src/index.ts index 9a8603369..396781c05 100644 --- a/packages/adapter-tests/src/index.ts +++ b/packages/adapter-tests/src/index.ts @@ -1,8 +1,8 @@ /* eslint-disable no-console */ -import basicTests from './basic' -import { AdapterTestName } from './declarations' -import methodTests from './methods' -import syntaxTests from './syntax' +import basicTests from './basic.js' +import { AdapterTestName } from './declarations.js' +import methodTests from './methods.js' +import syntaxTests from './syntax.js' export const adapterTests = (testNames: AdapterTestName[]) => { return (app: any, errors: any, serviceName: any, idProp = 'id') => { @@ -48,7 +48,7 @@ export const adapterTests = (testNames: AdapterTestName[]) => { } } -export * from './declarations' +export * from './declarations.js' export default adapterTests diff --git a/packages/adapter-tests/src/methods.ts b/packages/adapter-tests/src/methods.ts index 84d6c3f18..38f521e5f 100644 --- a/packages/adapter-tests/src/methods.ts +++ b/packages/adapter-tests/src/methods.ts @@ -1,5 +1,5 @@ import assert from 'assert' -import { AdapterMethodsTest } from './declarations' +import { AdapterMethodsTest } from './declarations.js' export default (test: AdapterMethodsTest, app: any, _errors: any, serviceName: string, idProp: string) => { describe(' Methods', () => { diff --git a/packages/adapter-tests/src/syntax.ts b/packages/adapter-tests/src/syntax.ts index e559d394c..3cf69a6fc 100644 --- a/packages/adapter-tests/src/syntax.ts +++ b/packages/adapter-tests/src/syntax.ts @@ -1,5 +1,5 @@ import assert from 'assert' -import { AdapterSyntaxTest } from './declarations' +import { AdapterSyntaxTest } from './declarations.js' export default (test: AdapterSyntaxTest, app: any, _errors: any, serviceName: string, idProp: string) => { describe('Query Syntax', () => { diff --git a/packages/adapter-tests/test/index.test.ts b/packages/adapter-tests/test/index.test.ts index fc4a3ad0e..b4d333602 100644 --- a/packages/adapter-tests/test/index.test.ts +++ b/packages/adapter-tests/test/index.test.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert' -import adapterTests from '../src' +import adapterTests from '../src/index.js' const testSuite = adapterTests([ '.events', @@ -78,8 +78,4 @@ describe('Feathers Memory Service', () => { it('loads the test suite', () => { assert.ok(typeof testSuite === 'function') }) - - it('exports as CommonJS', () => { - assert.equal(typeof require('../lib'), 'function') - }) }) diff --git a/packages/authentication-client/LICENSE b/packages/authentication-client/LICENSE index 7712f870f..f9b502c69 100644 --- a/packages/authentication-client/LICENSE +++ b/packages/authentication-client/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2024 Feathers Contributors +Copyright (c) 2025 Feathers Contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -19,4 +19,3 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - diff --git a/packages/authentication-client/README.md b/packages/authentication-client/README.md index aa47ecfb2..9e45077fb 100644 --- a/packages/authentication-client/README.md +++ b/packages/authentication-client/README.md @@ -18,6 +18,6 @@ Refer to the [Feathers authentication client API documentation](https://feathers ## License -Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) +Copyright (c) 2025 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) Licensed under the [MIT license](LICENSE). diff --git a/packages/authentication-client/package.json b/packages/authentication-client/package.json index 0d5c14177..a48837298 100644 --- a/packages/authentication-client/package.json +++ b/packages/authentication-client/package.json @@ -3,8 +3,8 @@ "description": "The authentication plugin for feathers-client", "version": "5.0.35", "homepage": "https://feathersjs.com", - "main": "lib/", - "types": "lib/", + "main": "lib/index.js", + "type": "module", "keywords": [ "feathers", "feathers-plugin" @@ -29,7 +29,7 @@ "url": "https://github.com/feathersjs/feathers/issues" }, "engines": { - "node": ">= 12" + "node": ">= 20" }, "files": [ "CHANGELOG.md", diff --git a/packages/authentication-client/src/core.ts b/packages/authentication-client/src/core.ts index cad7754e6..6cec8d82e 100644 --- a/packages/authentication-client/src/core.ts +++ b/packages/authentication-client/src/core.ts @@ -1,7 +1,7 @@ import { NotAuthenticated, FeathersError } from '@feathersjs/errors' -import { Application, Params } from '@feathersjs/feathers' -import { AuthenticationRequest, AuthenticationResult } from '@feathersjs/authentication' -import { Storage, StorageWrapper } from './storage' +import type { Application, Params } from '@feathersjs/feathers' +import type { AuthenticationRequest, AuthenticationResult } from '@feathersjs/authentication' +import { Storage, StorageWrapper } from './storage.js' class OauthError extends FeathersError { constructor(message: string, data?: any) { diff --git a/packages/authentication-client/src/hooks/authentication.ts b/packages/authentication-client/src/hooks/authentication.ts index bba7b2dc2..f04d2cb89 100644 --- a/packages/authentication-client/src/hooks/authentication.ts +++ b/packages/authentication-client/src/hooks/authentication.ts @@ -1,4 +1,4 @@ -import { HookContext, NextFunction } from '@feathersjs/feathers' +import type { HookContext, NextFunction } from '@feathersjs/feathers' import { stripSlashes } from '@feathersjs/commons' export const authentication = () => { diff --git a/packages/authentication-client/src/hooks/index.ts b/packages/authentication-client/src/hooks/index.ts index ef7cf4ea5..d1c4470d6 100644 --- a/packages/authentication-client/src/hooks/index.ts +++ b/packages/authentication-client/src/hooks/index.ts @@ -1,2 +1,2 @@ -export { authentication } from './authentication' -export { populateHeader } from './populate-header' +export { authentication } from './authentication.js' +export { populateHeader } from './populate-header.js' diff --git a/packages/authentication-client/src/hooks/populate-header.ts b/packages/authentication-client/src/hooks/populate-header.ts index 1b4776187..929871e74 100644 --- a/packages/authentication-client/src/hooks/populate-header.ts +++ b/packages/authentication-client/src/hooks/populate-header.ts @@ -1,5 +1,4 @@ -import { HookContext, NextFunction } from '@feathersjs/feathers' - +import type { HookContext, NextFunction } from '@feathersjs/feathers' export const populateHeader = () => { return (context: HookContext, next: NextFunction) => { const { diff --git a/packages/authentication-client/src/index.ts b/packages/authentication-client/src/index.ts index 5ab704a8d..7862233fc 100644 --- a/packages/authentication-client/src/index.ts +++ b/packages/authentication-client/src/index.ts @@ -1,9 +1,10 @@ -import { AuthenticationClient, AuthenticationClientOptions } from './core' -import * as hooks from './hooks' -import { Application } from '@feathersjs/feathers' -import { Storage, MemoryStorage, StorageWrapper } from './storage' +import type { AuthenticationClientOptions } from './core.js' +import { AuthenticationClient } from './core.js' +import * as hooks from './hooks/index.js' +import type { Application } from '@feathersjs/feathers' +import { Storage, MemoryStorage, StorageWrapper } from './storage.js' -declare module '@feathersjs/feathers/lib/declarations' { +declare module '@feathersjs/feathers' { // eslint-disable-next-line @typescript-eslint/no-unused-vars interface Application { // eslint-disable-line diff --git a/packages/authentication-client/test/index.test.ts b/packages/authentication-client/test/index.test.ts index 1720b45a4..4ae7891e1 100644 --- a/packages/authentication-client/test/index.test.ts +++ b/packages/authentication-client/test/index.test.ts @@ -1,8 +1,8 @@ import assert from 'assert' -import { feathers, Application } from '@feathersjs/feathers' - -import client from '../src' -import { AuthenticationClient } from '../src' +import type { Application } from '@feathersjs/feathers' +import { feathers } from '@feathersjs/feathers' +import client from '../src/index.js' +import { AuthenticationClient } from '../src/index.js' import { NotAuthenticated } from '@feathersjs/errors' describe('@feathersjs/authentication-client', () => { diff --git a/packages/authentication-client/test/integration/commons.ts b/packages/authentication-client/test/integration/commons.ts index 497353079..1c49508ee 100644 --- a/packages/authentication-client/test/integration/commons.ts +++ b/packages/authentication-client/test/integration/commons.ts @@ -1,6 +1,6 @@ import assert from 'assert' -import { Application } from '@feathersjs/feathers' -import '../../src' +import type { Application } from '@feathersjs/feathers' +import '../../src/index.js' export default ( getApp: () => Application, diff --git a/packages/authentication-client/test/integration/express.test.ts b/packages/authentication-client/test/integration/express.test.ts index e5f7709c6..7798c3520 100644 --- a/packages/authentication-client/test/integration/express.test.ts +++ b/packages/authentication-client/test/integration/express.test.ts @@ -1,12 +1,13 @@ import axios from 'axios' import { Server } from 'http' -import { feathers, Application as FeathersApplication } from '@feathersjs/feathers' +import type { Application as FeathersApplication } from '@feathersjs/feathers' +import { feathers } from '@feathersjs/feathers' import * as express from '@feathersjs/express' import rest from '@feathersjs/rest-client' -import authClient from '../../src' -import getApp from './fixture' -import commonTests from './commons' +import authClient from '../../src/index.js' +import getApp from './fixture.js' +import commonTests from './commons.js' describe('@feathersjs/authentication-client Express integration', () => { let app: express.Application diff --git a/packages/authentication-client/test/integration/fixture.ts b/packages/authentication-client/test/integration/fixture.ts index 1ecef9f9b..269484b65 100644 --- a/packages/authentication-client/test/integration/fixture.ts +++ b/packages/authentication-client/test/integration/fixture.ts @@ -1,5 +1,5 @@ import { authenticate } from '@feathersjs/authentication' -import { HookContext, Application } from '@feathersjs/feathers' +import type { HookContext, Application } from '@feathersjs/feathers' import { memory } from '@feathersjs/memory' import { AuthenticationService, JWTStrategy } from '@feathersjs/authentication' import { LocalStrategy, hooks } from '@feathersjs/authentication-local' diff --git a/packages/authentication-client/test/integration/socketio.test.ts b/packages/authentication-client/test/integration/socketio.test.ts index d6070e525..eb01d0713 100644 --- a/packages/authentication-client/test/integration/socketio.test.ts +++ b/packages/authentication-client/test/integration/socketio.test.ts @@ -1,14 +1,14 @@ import { io } from 'socket.io-client' import assert from 'assert' -import { feathers, Application } from '@feathersjs/feathers' +import type { Application } from '@feathersjs/feathers' +import { feathers } from '@feathersjs/feathers' import socketio from '@feathersjs/socketio' import socketioClient from '@feathersjs/socketio-client' -import authClient from '../../src' -import getApp from './fixture' -import commonTests from './commons' -import { AuthenticationResult } from '@feathersjs/authentication/lib' - +import authClient from '../../src/index.js' +import getApp from './fixture.js' +import commonTests from './commons.js' +import type { AuthenticationResult } from '@feathersjs/authentication' describe('@feathersjs/authentication-client Socket.io integration', () => { let app: Application diff --git a/packages/authentication-local/LICENSE b/packages/authentication-local/LICENSE index 7712f870f..f9b502c69 100644 --- a/packages/authentication-local/LICENSE +++ b/packages/authentication-local/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2024 Feathers Contributors +Copyright (c) 2025 Feathers Contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -19,4 +19,3 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - diff --git a/packages/authentication-local/README.md b/packages/authentication-local/README.md index 9215940bd..4eb731f96 100644 --- a/packages/authentication-local/README.md +++ b/packages/authentication-local/README.md @@ -18,6 +18,6 @@ Refer to the [Feathers local authentication API documentation](https://feathersj ## License -Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) +Copyright (c) 2025 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) Licensed under the [MIT license](LICENSE). diff --git a/packages/authentication-local/package.json b/packages/authentication-local/package.json index 4ca66214b..96fe2ed25 100644 --- a/packages/authentication-local/package.json +++ b/packages/authentication-local/package.json @@ -3,8 +3,8 @@ "description": "Local authentication strategy for @feathers/authentication", "version": "5.0.35", "homepage": "https://feathersjs.com", - "main": "lib/", - "types": "lib/", + "main": "lib/index.js", + "type": "module", "keywords": [ "feathers", "feathers-plugin" @@ -29,7 +29,7 @@ "url": "https://github.com/feathersjs/feathers/issues" }, "engines": { - "node": ">= 12" + "node": ">= 20" }, "files": [ "CHANGELOG.md", @@ -58,7 +58,7 @@ "@feathersjs/errors": "^5.0.35", "@feathersjs/feathers": "^5.0.35", "bcryptjs": "^3.0.2", - "lodash": "^4.17.21" + "lodash-es": "^4.17.21" }, "devDependencies": { "@feathersjs/memory": "^5.0.35", diff --git a/packages/authentication-local/src/hooks/hash-password.ts b/packages/authentication-local/src/hooks/hash-password.ts index 5a949bb85..fc5585f79 100644 --- a/packages/authentication-local/src/hooks/hash-password.ts +++ b/packages/authentication-local/src/hooks/hash-password.ts @@ -1,10 +1,9 @@ -import get from 'lodash/get' -import set from 'lodash/set' -import cloneDeep from 'lodash/cloneDeep' +import { get, set } from 'lodash-es' +import { cloneDeep } from 'lodash-es' import { BadRequest } from '@feathersjs/errors' import { createDebug } from '@feathersjs/commons' -import { HookContext, NextFunction } from '@feathersjs/feathers' -import { LocalStrategy } from '../strategy' +import type { HookContext, NextFunction } from '@feathersjs/feathers' +import { LocalStrategy } from '../strategy.js' const debug = createDebug('@feathersjs/authentication-local/hooks/hash-password') diff --git a/packages/authentication-local/src/hooks/protect.ts b/packages/authentication-local/src/hooks/protect.ts index eb1657e94..d30f292e6 100644 --- a/packages/authentication-local/src/hooks/protect.ts +++ b/packages/authentication-local/src/hooks/protect.ts @@ -1,6 +1,5 @@ -import omit from 'lodash/omit' -import { HookContext, NextFunction } from '@feathersjs/feathers' - +import { omit } from 'lodash-es' +import type { HookContext, NextFunction } from '@feathersjs/feathers' /** * @deprecated For reliable safe data representations use Feathers schema dispatch resolvers. * @see https://dove.feathersjs.comapi/authentication/local.html#protecting-fields diff --git a/packages/authentication-local/src/index.ts b/packages/authentication-local/src/index.ts index 5e9b827e7..fd014f013 100644 --- a/packages/authentication-local/src/index.ts +++ b/packages/authentication-local/src/index.ts @@ -1,7 +1,7 @@ -import { HookContext } from '@feathersjs/feathers' -import hashPassword from './hooks/hash-password' -import protect from './hooks/protect' -import { LocalStrategy } from './strategy' +import type { HookContext } from '@feathersjs/feathers' +import hashPassword from './hooks/hash-password.js' +import protect from './hooks/protect.js' +import { LocalStrategy } from './strategy.js' export const hooks = { hashPassword, protect } export { LocalStrategy } diff --git a/packages/authentication-local/src/strategy.ts b/packages/authentication-local/src/strategy.ts index 86129792b..09eb12a53 100644 --- a/packages/authentication-local/src/strategy.ts +++ b/packages/authentication-local/src/strategy.ts @@ -1,9 +1,10 @@ /* eslint-disable @typescript-eslint/no-unused-vars */ import bcrypt from 'bcryptjs' -import get from 'lodash/get' +import { get } from 'lodash-es' import { NotAuthenticated } from '@feathersjs/errors' -import { Query, Params } from '@feathersjs/feathers' -import { AuthenticationRequest, AuthenticationBaseStrategy } from '@feathersjs/authentication' +import type { Query, Params } from '@feathersjs/feathers' +import type { AuthenticationRequest } from '@feathersjs/authentication' +import { AuthenticationBaseStrategy } from '@feathersjs/authentication' import { createDebug } from '@feathersjs/commons' const debug = createDebug('@feathersjs/authentication-local/strategy') diff --git a/packages/authentication-local/test/fixture.ts b/packages/authentication-local/test/fixture.ts index 32be7b476..0bd44e0d0 100644 --- a/packages/authentication-local/test/fixture.ts +++ b/packages/authentication-local/test/fixture.ts @@ -2,7 +2,7 @@ import { feathers } from '@feathersjs/feathers' import { memory, MemoryService } from '@feathersjs/memory' import { AuthenticationService, JWTStrategy } from '@feathersjs/authentication' -import { LocalStrategy, hooks } from '../src' +import { LocalStrategy, hooks } from '../src/index.js' const { hashPassword, protect } = hooks export type ServiceTypes = { diff --git a/packages/authentication-local/test/hooks/hash-password.test.ts b/packages/authentication-local/test/hooks/hash-password.test.ts index fb45bc928..a7e2baf08 100644 --- a/packages/authentication-local/test/hooks/hash-password.test.ts +++ b/packages/authentication-local/test/hooks/hash-password.test.ts @@ -1,9 +1,8 @@ /* eslint-disable @typescript-eslint/ban-ts-comment */ import assert from 'assert' -import { Application } from '@feathersjs/feathers' - -import { hooks } from '../../src' -import { createApplication, ServiceTypes } from '../fixture' +import type { Application } from '@feathersjs/feathers' +import { hooks } from '../../src/index.js' +import { createApplication, type ServiceTypes } from '../fixture.js' const { hashPassword } = hooks diff --git a/packages/authentication-local/test/hooks/protect.test.ts b/packages/authentication-local/test/hooks/protect.test.ts index 20e1320c3..498774873 100644 --- a/packages/authentication-local/test/hooks/protect.test.ts +++ b/packages/authentication-local/test/hooks/protect.test.ts @@ -1,6 +1,6 @@ import assert from 'assert' -import { HookContext } from '@feathersjs/feathers' -import { hooks } from '../../src' +import type { HookContext } from '@feathersjs/feathers' +import { hooks } from '../../src/index.js' const { protect } = hooks diff --git a/packages/authentication-local/test/strategy.test.ts b/packages/authentication-local/test/strategy.test.ts index a8fca0fe1..d5166da8d 100644 --- a/packages/authentication-local/test/strategy.test.ts +++ b/packages/authentication-local/test/strategy.test.ts @@ -1,10 +1,10 @@ import assert from 'assert' -import omit from 'lodash/omit' -import { Application, HookContext } from '@feathersjs/feathers' +import { omit } from 'lodash-es' +import type { Application, HookContext } from '@feathersjs/feathers' import { resolve } from '@feathersjs/schema' -import { LocalStrategy, passwordHash } from '../src' -import { createApplication, ServiceTypes } from './fixture' +import { LocalStrategy, passwordHash } from '../src/index.js' +import { createApplication, type ServiceTypes } from './fixture.js' describe('@feathersjs/authentication-local/strategy', () => { const password = 'localsecret' diff --git a/packages/authentication-oauth/LICENSE b/packages/authentication-oauth/LICENSE index 7839c824d..f9b502c69 100644 --- a/packages/authentication-oauth/LICENSE +++ b/packages/authentication-oauth/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2024 Feathers Contributors +Copyright (c) 2025 Feathers Contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/packages/authentication-oauth/README.md b/packages/authentication-oauth/README.md index 797a93230..2e4be04b3 100644 --- a/packages/authentication-oauth/README.md +++ b/packages/authentication-oauth/README.md @@ -18,6 +18,6 @@ Refer to the [Feathers oAuth authentication API documentation](https://feathersj ## License -Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) +Copyright (c) 2025 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) Licensed under the [MIT license](LICENSE). diff --git a/packages/authentication-oauth/package.json b/packages/authentication-oauth/package.json index e6b7b258b..9c7679643 100644 --- a/packages/authentication-oauth/package.json +++ b/packages/authentication-oauth/package.json @@ -3,8 +3,8 @@ "description": "oAuth 1 and 2 authentication for Feathers. Powered by Grant.", "version": "5.0.35", "homepage": "https://feathersjs.com", - "main": "lib/", - "types": "lib/", + "main": "lib/index.js", + "type": "module", "keywords": [ "feathers", "feathers-plugin" @@ -29,7 +29,7 @@ "url": "https://github.com/feathersjs/feathers/issues" }, "engines": { - "node": ">= 12" + "node": ">= 20" }, "files": [ "CHANGELOG.md", @@ -69,7 +69,6 @@ "devDependencies": { "@feathersjs/memory": "^5.0.35", "@types/cookie-session": "^2.0.49", - "@types/express": "^4.17.21", "@types/koa-session": "^6.4.5", "@types/mocha": "^10.0.10", "@types/node": "^24.3.1", diff --git a/packages/authentication-oauth/src/index.ts b/packages/authentication-oauth/src/index.ts index 9d25b6f6c..f62d1996d 100644 --- a/packages/authentication-oauth/src/index.ts +++ b/packages/authentication-oauth/src/index.ts @@ -1,10 +1,10 @@ -import { Application } from '@feathersjs/feathers' +import type { Application } from '@feathersjs/feathers' import { createDebug } from '@feathersjs/commons' import { resolveDispatch } from '@feathersjs/schema' -import { OAuthStrategy, OAuthProfile } from './strategy' -import { redirectHook, OAuthService, OAuthCallbackService } from './service' -import { getGrantConfig, authenticationServiceOptions, OauthSetupSettings } from './utils' +import { OAuthStrategy, OAuthProfile } from './strategy.js' +import { redirectHook, OAuthService, OAuthCallbackService } from './service.js' +import { getGrantConfig, authenticationServiceOptions, OauthSetupSettings } from './utils.js' const debug = createDebug('@feathersjs/authentication-oauth') diff --git a/packages/authentication-oauth/src/service.ts b/packages/authentication-oauth/src/service.ts index 1ae575d6a..8502a7b90 100644 --- a/packages/authentication-oauth/src/service.ts +++ b/packages/authentication-oauth/src/service.ts @@ -1,12 +1,12 @@ import { createDebug } from '@feathersjs/commons' -import { HookContext, NextFunction, Params } from '@feathersjs/feathers' +import type { HookContext, NextFunction, Params } from '@feathersjs/feathers' import { FeathersError, GeneralError } from '@feathersjs/errors' // eslint-disable-next-line @typescript-eslint/ban-ts-comment //@ts-ignore -import Grant from 'grant/lib/grant' +import Grant from 'grant/lib/grant.js' import { AuthenticationService } from '@feathersjs/authentication' -import { OAuthStrategy } from './strategy' -import { getGrantConfig, OauthSetupSettings } from './utils' +import { OAuthStrategy } from './strategy.js' +import { getGrantConfig, OauthSetupSettings } from './utils.js' const debug = createDebug('@feathersjs/authentication-oauth/services') diff --git a/packages/authentication-oauth/src/strategy.ts b/packages/authentication-oauth/src/strategy.ts index 4bfe2589f..93f99a5a7 100644 --- a/packages/authentication-oauth/src/strategy.ts +++ b/packages/authentication-oauth/src/strategy.ts @@ -1,10 +1,10 @@ -import { +import type { AuthenticationRequest, - AuthenticationBaseStrategy, AuthenticationResult, AuthenticationParams } from '@feathersjs/authentication' -import { Params } from '@feathersjs/feathers' +import { AuthenticationBaseStrategy } from '@feathersjs/authentication' +import type { Params } from '@feathersjs/feathers' import { NotAuthenticated } from '@feathersjs/errors' import { createDebug, _ } from '@feathersjs/commons' import qs from 'qs' diff --git a/packages/authentication-oauth/test/index.test.ts b/packages/authentication-oauth/test/index.test.ts index f4e192482..c6491cf54 100644 --- a/packages/authentication-oauth/test/index.test.ts +++ b/packages/authentication-oauth/test/index.test.ts @@ -1,6 +1,6 @@ import { strict as assert } from 'assert' import { feathers } from '@feathersjs/feathers' -import { oauth, OauthSetupSettings } from '../src' +import { oauth, type OauthSetupSettings } from '../src/index.js' import { AuthenticationService } from '@feathersjs/authentication' describe('@feathersjs/authentication-oauth', () => { diff --git a/packages/authentication-oauth/test/service.test.ts b/packages/authentication-oauth/test/service.test.ts index a39310763..7746f9bc1 100644 --- a/packages/authentication-oauth/test/service.test.ts +++ b/packages/authentication-oauth/test/service.test.ts @@ -1,7 +1,7 @@ import { strict as assert } from 'assert' -import axios, { AxiosResponse } from 'axios' +import axios, { type AxiosResponse } from 'axios' import { CookieJar } from 'tough-cookie' -import { expressFixture } from './utils/fixture' +import { expressFixture } from './utils/fixture.js' describe('@feathersjs/authentication-oauth service', () => { const port = 9778 diff --git a/packages/authentication-oauth/test/strategy.test.ts b/packages/authentication-oauth/test/strategy.test.ts index a4386fcbc..cb0a771d4 100644 --- a/packages/authentication-oauth/test/strategy.test.ts +++ b/packages/authentication-oauth/test/strategy.test.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert' -import { expressFixture, TestOAuthStrategy } from './utils/fixture' +import { expressFixture, TestOAuthStrategy } from './utils/fixture.js' import { AuthenticationService } from '@feathersjs/authentication' describe('@feathersjs/authentication-oauth/strategy', () => { diff --git a/packages/authentication-oauth/test/utils.test.ts b/packages/authentication-oauth/test/utils.test.ts index 76a3bd34e..6919f6b78 100644 --- a/packages/authentication-oauth/test/utils.test.ts +++ b/packages/authentication-oauth/test/utils.test.ts @@ -1,7 +1,7 @@ -import { AuthenticationService } from '@feathersjs/authentication/lib' -import { feathers } from '@feathersjs/feathers/lib' +import { AuthenticationService } from '@feathersjs/authentication' +import { feathers } from '@feathersjs/feathers' import { strict as assert } from 'assert' -import { getGrantConfig } from '../src/utils' +import { getGrantConfig } from '../src/utils.js' describe('@feathersjs/authentication-oauth/utils', () => { it('getGrantConfig initialises Grant defaults', () => { diff --git a/packages/authentication-oauth/test/utils/fixture.ts b/packages/authentication-oauth/test/utils/fixture.ts index 0371f516e..a80ff3f0d 100644 --- a/packages/authentication-oauth/test/utils/fixture.ts +++ b/packages/authentication-oauth/test/utils/fixture.ts @@ -1,14 +1,11 @@ -import { Application, feathers, NextFunction } from '@feathersjs/feathers' +import type { Application, NextFunction } from '@feathersjs/feathers' +import { feathers } from '@feathersjs/feathers' import express, { rest, errorHandler } from '@feathersjs/express' import { memory, MemoryService } from '@feathersjs/memory' -import { - AuthenticationService, - JWTStrategy, - AuthenticationRequest, - AuthenticationParams -} from '@feathersjs/authentication' -import { provider } from './provider' -import { oauth, OAuthStrategy } from '../../src' +import type { AuthenticationRequest, AuthenticationParams } from '@feathersjs/authentication' +import { AuthenticationService, JWTStrategy } from '@feathersjs/authentication' +import { provider } from './provider.js' +import { oauth, OAuthStrategy } from '../../src/index.js' export interface ServiceTypes { authentication: AuthenticationService diff --git a/packages/authentication/LICENSE b/packages/authentication/LICENSE index 7712f870f..f9b502c69 100644 --- a/packages/authentication/LICENSE +++ b/packages/authentication/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2024 Feathers Contributors +Copyright (c) 2025 Feathers Contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -19,4 +19,3 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - diff --git a/packages/authentication/README.md b/packages/authentication/README.md index c669c7c28..a8870b40c 100644 --- a/packages/authentication/README.md +++ b/packages/authentication/README.md @@ -18,6 +18,6 @@ Refer to the [Feathers authentication API documentation](https://feathersjs.com/ ## License -Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) +Copyright (c) 2025 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) Licensed under the [MIT license](LICENSE). diff --git a/packages/authentication/package.json b/packages/authentication/package.json index 2d0d33352..5c3f9591a 100644 --- a/packages/authentication/package.json +++ b/packages/authentication/package.json @@ -3,8 +3,8 @@ "description": "Add Authentication to your FeathersJS app.", "version": "5.0.35", "homepage": "https://feathersjs.com", - "main": "lib/", - "types": "lib/", + "main": "lib/index.js", + "type": "module", "keywords": [ "feathers", "feathers-plugin" @@ -38,7 +38,7 @@ "url": "https://github.com/feathersjs/feathers/issues" }, "engines": { - "node": ">= 12" + "node": ">= 20" }, "scripts": { "prepublish": "npm run compile", @@ -56,14 +56,14 @@ "@feathersjs/commons": "^5.0.35", "@feathersjs/errors": "^5.0.35", "@feathersjs/feathers": "^5.0.35", - "@feathersjs/hooks": "^0.9.0", + "@feathersjs/hooks": "^5.0.35", "@feathersjs/schema": "^5.0.35", "@feathersjs/transport-commons": "^5.0.35", "@types/jsonwebtoken": "^9.0.10", "jsonwebtoken": "^9.0.2", - "lodash": "^4.17.21", + "lodash-es": "^4.17.21", "long-timeout": "^0.1.1", - "uuid": "^11.1.0" + "uuid": "^13.0.0" }, "devDependencies": { "@feathersjs/memory": "^5.0.35", diff --git a/packages/authentication/src/core.ts b/packages/authentication/src/core.ts index 623bc56d4..44740acce 100644 --- a/packages/authentication/src/core.ts +++ b/packages/authentication/src/core.ts @@ -1,12 +1,12 @@ -import merge from 'lodash/merge' +import { merge } from 'lodash-es' import jsonwebtoken, { SignOptions, Secret, VerifyOptions, Algorithm } from 'jsonwebtoken' import { v4 as uuidv4 } from 'uuid' import { NotAuthenticated } from '@feathersjs/errors' import { createDebug } from '@feathersjs/commons' -import { Application, Params } from '@feathersjs/feathers' +import type { Application, Params } from '@feathersjs/feathers' import { IncomingMessage, ServerResponse } from 'http' -import { AuthenticationConfiguration, defaultOptions } from './options' - +import type { AuthenticationConfiguration } from './options.js' +import { defaultOptions } from './options.js' const debug = createDebug('@feathersjs/authentication/base') export interface AuthenticationResult { diff --git a/packages/authentication/src/hooks/authenticate.ts b/packages/authentication/src/hooks/authenticate.ts index ad3cdf4c1..b65f63497 100644 --- a/packages/authentication/src/hooks/authenticate.ts +++ b/packages/authentication/src/hooks/authenticate.ts @@ -1,4 +1,4 @@ -import { HookContext, NextFunction } from '@feathersjs/feathers' +import type { HookContext, NextFunction } from '@feathersjs/feathers' import { NotAuthenticated } from '@feathersjs/errors' import { createDebug } from '@feathersjs/commons' diff --git a/packages/authentication/src/hooks/connection.ts b/packages/authentication/src/hooks/connection.ts index 4cf06c12d..a1d960e30 100644 --- a/packages/authentication/src/hooks/connection.ts +++ b/packages/authentication/src/hooks/connection.ts @@ -1,6 +1,6 @@ -import { HookContext, NextFunction } from '@feathersjs/feathers' -import { AuthenticationBase, ConnectionEvent } from '../core' - +import type { HookContext, NextFunction } from '@feathersjs/feathers' +import type { ConnectionEvent } from '../core.js' +import { AuthenticationBase } from '../core.js' export default (event: ConnectionEvent) => async (context: HookContext, next: NextFunction) => { await next() diff --git a/packages/authentication/src/hooks/event.ts b/packages/authentication/src/hooks/event.ts index 44b6953b9..2e6d5d6a3 100644 --- a/packages/authentication/src/hooks/event.ts +++ b/packages/authentication/src/hooks/event.ts @@ -1,7 +1,6 @@ -import { HookContext, NextFunction } from '@feathersjs/feathers' +import type { HookContext, NextFunction } from '@feathersjs/feathers' import { createDebug } from '@feathersjs/commons' -import { ConnectionEvent } from '../core' - +import type { ConnectionEvent } from '../core.js' const debug = createDebug('@feathersjs/authentication/hooks/connection') export default (event: ConnectionEvent) => async (context: HookContext, next: NextFunction) => { diff --git a/packages/authentication/src/hooks/index.ts b/packages/authentication/src/hooks/index.ts index 4c9a354cf..964d943b4 100644 --- a/packages/authentication/src/hooks/index.ts +++ b/packages/authentication/src/hooks/index.ts @@ -1,3 +1,3 @@ -export { default as authenticate } from './authenticate' -export { default as connection } from './connection' -export { default as event } from './event' +export { default as authenticate } from './authenticate.js' +export { default as connection } from './connection.js' +export { default as event } from './event.js' diff --git a/packages/authentication/src/index.ts b/packages/authentication/src/index.ts index f7ea82a17..5f96cc3d4 100644 --- a/packages/authentication/src/index.ts +++ b/packages/authentication/src/index.ts @@ -1,5 +1,5 @@ -export * as hooks from './hooks' -export { authenticate } from './hooks' +export * as hooks from './hooks/index.js' +export { authenticate } from './hooks/index.js' export { AuthenticationBase, AuthenticationRequest, @@ -8,8 +8,8 @@ export { AuthenticationParams, ConnectionEvent, JwtVerifyOptions -} from './core' -export { AuthenticationBaseStrategy } from './strategy' -export { AuthenticationService } from './service' -export { JWTStrategy } from './jwt' -export { authenticationSettingsSchema, AuthenticationConfiguration } from './options' +} from './core.js' +export { AuthenticationBaseStrategy } from './strategy.js' +export { AuthenticationService } from './service.js' +export { JWTStrategy } from './jwt.js' +export { authenticationSettingsSchema, AuthenticationConfiguration } from './options.js' diff --git a/packages/authentication/src/jwt.ts b/packages/authentication/src/jwt.ts index 0724760b1..86d9fbad5 100644 --- a/packages/authentication/src/jwt.ts +++ b/packages/authentication/src/jwt.ts @@ -1,14 +1,18 @@ /* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/ban-ts-comment */ import { IncomingMessage } from 'http' import { NotAuthenticated } from '@feathersjs/errors' -import { Params } from '@feathersjs/feathers' +import type { Params } from '@feathersjs/feathers' import { createDebug } from '@feathersjs/commons' // @ts-ignore import lt from 'long-timeout' -import { AuthenticationBaseStrategy } from './strategy' -import { AuthenticationParams, AuthenticationRequest, AuthenticationResult, ConnectionEvent } from './core' - +import { AuthenticationBaseStrategy } from './strategy.js' +import type { + AuthenticationParams, + AuthenticationRequest, + AuthenticationResult, + ConnectionEvent +} from './core.js' const debug = createDebug('@feathersjs/authentication/jwt') const SPLIT_HEADER = /(\S+)\s+(\S+)/ diff --git a/packages/authentication/src/options.ts b/packages/authentication/src/options.ts index 217688908..ef9948fb6 100644 --- a/packages/authentication/src/options.ts +++ b/packages/authentication/src/options.ts @@ -1,5 +1,5 @@ -import { FromSchema, authenticationSettingsSchema } from '@feathersjs/schema' - +import type { FromSchema } from '@feathersjs/schema' +import { authenticationSettingsSchema } from '@feathersjs/schema' export const defaultOptions = { authStrategies: [] as string[], jwtOptions: { diff --git a/packages/authentication/src/service.ts b/packages/authentication/src/service.ts index cba07330a..5b1779038 100644 --- a/packages/authentication/src/service.ts +++ b/packages/authentication/src/service.ts @@ -1,19 +1,20 @@ -import merge from 'lodash/merge' +import { merge } from 'lodash-es' import { NotAuthenticated } from '@feathersjs/errors' import '@feathersjs/transport-commons' import { createDebug } from '@feathersjs/commons' -import { ServiceMethods } from '@feathersjs/feathers' +import type { ServiceMethods } from '@feathersjs/feathers' import { resolveDispatch } from '@feathersjs/schema' import jsonwebtoken from 'jsonwebtoken' import { hooks } from '@feathersjs/hooks' -import { AuthenticationBase, AuthenticationResult, AuthenticationRequest, AuthenticationParams } from './core' -import { connection, event } from './hooks' -import { RealTimeConnection } from '@feathersjs/feathers' +import type { AuthenticationResult, AuthenticationRequest, AuthenticationParams } from './core.js' +import { AuthenticationBase } from './core.js' +import { connection, event } from './hooks/index.js' +import type { RealTimeConnection } from '@feathersjs/feathers' const debug = createDebug('@feathersjs/authentication/service') -declare module '@feathersjs/feathers/lib/declarations' { +declare module '@feathersjs/feathers' { // eslint-disable-next-line @typescript-eslint/no-unused-vars interface FeathersApplication { // eslint-disable-line diff --git a/packages/authentication/src/strategy.ts b/packages/authentication/src/strategy.ts index 99a1ec9c5..1928ab7cd 100644 --- a/packages/authentication/src/strategy.ts +++ b/packages/authentication/src/strategy.ts @@ -1,6 +1,6 @@ -import { AuthenticationStrategy, AuthenticationBase } from './core' -import { Application, Service } from '@feathersjs/feathers' - +import type { AuthenticationStrategy } from './core.js' +import { AuthenticationBase } from './core.js' +import type { Application, Service } from '@feathersjs/feathers' export class AuthenticationBaseStrategy implements AuthenticationStrategy { authentication?: AuthenticationBase app?: Application diff --git a/packages/authentication/test/core.test.ts b/packages/authentication/test/core.test.ts index 3ffcf97ec..2cd81b08f 100644 --- a/packages/authentication/test/core.test.ts +++ b/packages/authentication/test/core.test.ts @@ -1,12 +1,15 @@ /* eslint-disable @typescript-eslint/ban-ts-comment */ import assert from 'assert' -import { feathers, Application } from '@feathersjs/feathers' +import type { Application } from '@feathersjs/feathers' +import { feathers } from '@feathersjs/feathers' import jwt from 'jsonwebtoken' -import { Infer, schema } from '@feathersjs/schema' +import type { Infer } from '@feathersjs/schema' +import { schema } from '@feathersjs/schema' +import type { AuthenticationRequest } from '../src/core.js' -import { AuthenticationBase, AuthenticationRequest } from '../src/core' -import { authenticationSettingsSchema } from '../src/options' -import { Strategy1, Strategy2, MockRequest } from './fixtures' +import { AuthenticationBase } from '../src/core.js' +import { authenticationSettingsSchema } from '../src/options.js' +import { Strategy1, Strategy2, type MockRequest } from './fixtures.js' import { ServerResponse } from 'http' const UUID = /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/ diff --git a/packages/authentication/test/fixtures.ts b/packages/authentication/test/fixtures.ts index aba18afde..14825e123 100644 --- a/packages/authentication/test/fixtures.ts +++ b/packages/authentication/test/fixtures.ts @@ -1,9 +1,8 @@ import { NotAuthenticated } from '@feathersjs/errors' -import { Params } from '@feathersjs/feathers' - -import { AuthenticationRequest } from '../src/core' +import type { Params } from '@feathersjs/feathers' +import type { AuthenticationRequest } from '../src/core.js' import { IncomingMessage } from 'http' -import { AuthenticationBaseStrategy } from '../src/strategy' +import { AuthenticationBaseStrategy } from '../src/strategy.js' export interface MockRequest extends IncomingMessage { isDave?: boolean diff --git a/packages/authentication/test/hooks/authenticate.test.ts b/packages/authentication/test/hooks/authenticate.test.ts index 89b7bad51..0cda2b90c 100644 --- a/packages/authentication/test/hooks/authenticate.test.ts +++ b/packages/authentication/test/hooks/authenticate.test.ts @@ -1,9 +1,9 @@ /* eslint-disable @typescript-eslint/ban-ts-comment */ import assert from 'assert' -import { feathers, Application, Params, ServiceMethods } from '@feathersjs/feathers' - -import { Strategy1, Strategy2 } from '../fixtures' -import { AuthenticationService, hooks } from '../../src' +import type { Application, Params, ServiceMethods } from '@feathersjs/feathers' +import { feathers } from '@feathersjs/feathers' +import { Strategy1, Strategy2 } from '../fixtures.js' +import { AuthenticationService, hooks } from '../../src/index.js' const { authenticate } = hooks diff --git a/packages/authentication/test/hooks/event.test.ts b/packages/authentication/test/hooks/event.test.ts index e602febdf..8257a54c7 100644 --- a/packages/authentication/test/hooks/event.test.ts +++ b/packages/authentication/test/hooks/event.test.ts @@ -1,9 +1,8 @@ import assert from 'assert' -import { feathers, HookContext } from '@feathersjs/feathers' - -import hook from '../../src/hooks/event' -import { AuthenticationParams, AuthenticationRequest, AuthenticationResult } from '../../src/core' - +import type { HookContext } from '@feathersjs/feathers' +import { feathers } from '@feathersjs/feathers' +import hook from '../../src/hooks/event.js' +import type { AuthenticationParams, AuthenticationRequest, AuthenticationResult } from '../../src/core.js' describe('authentication/hooks/events', () => { const app = feathers().use('authentication', { async create(data: AuthenticationRequest) { diff --git a/packages/authentication/test/jwt.test.ts b/packages/authentication/test/jwt.test.ts index 8120d3cb9..c1374f0fb 100644 --- a/packages/authentication/test/jwt.test.ts +++ b/packages/authentication/test/jwt.test.ts @@ -1,12 +1,13 @@ import assert from 'assert' -import merge from 'lodash/merge' -import { feathers, Application, Service } from '@feathersjs/feathers' +import { merge } from 'lodash-es' +import type { Application, Service } from '@feathersjs/feathers' +import { feathers } from '@feathersjs/feathers' import { memory } from '@feathersjs/memory' import { getDispatch, resolve, resolveDispatch } from '@feathersjs/schema' -import { AuthenticationService, JWTStrategy, hooks } from '../src' +import { AuthenticationService, JWTStrategy, hooks } from '../src/index.js' import { ServerResponse } from 'http' -import { MockRequest } from './fixtures' +import type { MockRequest } from './fixtures.js' const { authenticate } = hooks diff --git a/packages/authentication/test/service.test.ts b/packages/authentication/test/service.test.ts index 3594822bb..204945a3f 100644 --- a/packages/authentication/test/service.test.ts +++ b/packages/authentication/test/service.test.ts @@ -1,14 +1,15 @@ /* eslint-disable @typescript-eslint/ban-ts-comment */ import assert from 'assert' -import omit from 'lodash/omit' +import { omit } from 'lodash-es' import jwt from 'jsonwebtoken' -import { feathers, Application } from '@feathersjs/feathers' +import type { Application } from '@feathersjs/feathers' +import { feathers } from '@feathersjs/feathers' import { memory, MemoryService } from '@feathersjs/memory' -import { defaultOptions } from '../src/options' -import { AuthenticationService } from '../src' +import { defaultOptions } from '../src/options.js' +import { AuthenticationService } from '../src/index.js' -import { Strategy1 } from './fixtures' +import { Strategy1 } from './fixtures.js' const UUID = /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/ @@ -308,7 +309,6 @@ describe('authentication/service', () => { it('passes when entity service exists and `entityId` property is set', () => { app.get('authentication').entityId = 'id' - app.use('users', memory()) app.setup() }) diff --git a/packages/cli/LICENSE b/packages/cli/LICENSE index 7839c824d..f9b502c69 100644 --- a/packages/cli/LICENSE +++ b/packages/cli/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2024 Feathers Contributors +Copyright (c) 2025 Feathers Contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/packages/cli/README.md b/packages/cli/README.md index 3b99960ca..4634568ad 100644 --- a/packages/cli/README.md +++ b/packages/cli/README.md @@ -23,6 +23,6 @@ Refer to the [Feathers CLI guide](https://feathersjs.com/guides/cli/) for more d ## License -Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) +Copyright (c) 2025 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) Licensed under the [MIT license](LICENSE). diff --git a/packages/cli/package.json b/packages/cli/package.json index 458499465..ec8ef6eaf 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -31,7 +31,7 @@ "url": "https://github.com/feathersjs/feathers/issues" }, "engines": { - "node": ">= 14" + "node": ">= 20" }, "files": [ "CHANGELOG.md", @@ -55,7 +55,7 @@ "dependencies": { "@feathersjs/generators": "^5.0.35", "chalk": "^5.6.2", - "commander": "^13.1.0" + "commander": "^14.0.0" }, "devDependencies": { "@feathersjs/adapter-commons": "^5.0.35", diff --git a/packages/cli/test/cli.test.ts b/packages/cli/test/cli.test.ts index afd1a1447..6b04274fc 100644 --- a/packages/cli/test/cli.test.ts +++ b/packages/cli/test/cli.test.ts @@ -1,5 +1,5 @@ import { strict } from 'assert' -import { program } from '../src' +import { program } from '../src/index.js' describe('cli tests', () => { it('exports the program', async () => { diff --git a/packages/client/README.md b/packages/client/README.md index 934b1157f..ff7dcd887 100644 --- a/packages/client/README.md +++ b/packages/client/README.md @@ -18,6 +18,6 @@ Refer to the [Feathers client API documentation](https://docs.feathersjs.com/api ## License -Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) +Copyright (c) 2025 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) Licensed under the [MIT license](LICENSE). diff --git a/packages/client/core.js b/packages/client/core.js index b55021edd..5caac63c8 100644 --- a/packages/client/core.js +++ b/packages/client/core.js @@ -1 +1 @@ -module.exports = require('./dist/core'); +export * from './dist/core' diff --git a/packages/client/package.json b/packages/client/package.json index 6cf637949..4751283a5 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -22,10 +22,11 @@ ], "author": "Feathers contributors", "engines": { - "node": ">= 12" + "node": ">= 20" }, "main": "dist/feathers", "types": "dist/feathers", + "type": "module", "files": [ "CHANGELOG.md", "LICENSE", @@ -64,7 +65,6 @@ "@feathersjs/tests": "^5.0.35", "babel-loader": "^10.0.0", "mocha": "^11.7.2", - "node-fetch": "^2.6.1", "shx": "^0.4.0", "socket.io-client": "^4.8.1", "superagent": "^10.2.3", diff --git a/packages/client/src/feathers.ts b/packages/client/src/feathers.ts index e3522cb37..06647206c 100644 --- a/packages/client/src/feathers.ts +++ b/packages/client/src/feathers.ts @@ -7,7 +7,3 @@ export * from '@feathersjs/feathers' export * as errors from '@feathersjs/errors' export { authentication, rest, socketio } export default feathers - -if (typeof module !== 'undefined') { - module.exports = Object.assign(feathers, module.exports) -} diff --git a/packages/client/test/fetch.test.ts b/packages/client/test/fetch.test.ts index 22f626a4a..4debf4f14 100644 --- a/packages/client/test/fetch.test.ts +++ b/packages/client/test/fetch.test.ts @@ -1,11 +1,8 @@ -/* eslint-disable @typescript-eslint/ban-ts-comment */ -// @ts-ignore -import fetch from 'node-fetch' import { Server } from 'http' import { clientTests } from '@feathersjs/tests' -import * as feathers from '../dist/feathers' -import app from './fixture' +import * as feathers from '../dist/feathers.js' +import app from './fixture.js' describe('fetch REST connector', function () { let server: Server diff --git a/packages/client/test/fixture.ts b/packages/client/test/fixture.ts index de42f60d6..72e1a8a16 100644 --- a/packages/client/test/fixture.ts +++ b/packages/client/test/fixture.ts @@ -1,4 +1,5 @@ -import { feathers, Application, HookContext, Id, Params } from '@feathersjs/feathers' +import type { Application, HookContext, Id, Params } from '@feathersjs/feathers' +import { feathers } from '@feathersjs/feathers' import * as express from '@feathersjs/express' import { MemoryService } from '@feathersjs/memory' diff --git a/packages/client/test/socketio.test.ts b/packages/client/test/socketio.test.ts index 74a86cd73..1b143f888 100644 --- a/packages/client/test/socketio.test.ts +++ b/packages/client/test/socketio.test.ts @@ -3,8 +3,8 @@ import socketio from '@feathersjs/socketio' import { Server } from 'http' import { clientTests } from '@feathersjs/tests' -import * as feathers from '../dist/feathers' -import app from './fixture' +import * as feathers from '../dist/feathers.js' +import app from './fixture.js' describe('Socket.io connector', function () { let server: Server diff --git a/packages/client/test/superagent.test.ts b/packages/client/test/superagent.test.ts index ea158b974..dcada2f57 100644 --- a/packages/client/test/superagent.test.ts +++ b/packages/client/test/superagent.test.ts @@ -2,8 +2,8 @@ import superagent from 'superagent' import { clientTests } from '@feathersjs/tests' import { Server } from 'http' -import * as feathers from '../dist/feathers' -import app from './fixture' +import * as feathers from '../dist/feathers.js' +import app from './fixture.js' describe('Superagent REST connector', function () { let server: Server diff --git a/packages/client/webpack/core.js b/packages/client/webpack/core.js index 7b7144dc0..401689e41 100644 --- a/packages/client/webpack/core.js +++ b/packages/client/webpack/core.js @@ -1,3 +1,3 @@ -const createConfig = require('./create-config'); +import createConfig from './create-config.js' -module.exports = createConfig('core'); \ No newline at end of file +export default createConfig('core') diff --git a/packages/client/webpack/core.min.js b/packages/client/webpack/core.min.js index 79bd67d79..728fa15ab 100644 --- a/packages/client/webpack/core.min.js +++ b/packages/client/webpack/core.min.js @@ -1,3 +1,3 @@ -const createConfig = require('./create-config'); +import createConfig from './create-config.js' -module.exports = createConfig('core', true); \ No newline at end of file +export default createConfig('core', true) diff --git a/packages/client/webpack/create-config.js b/packages/client/webpack/create-config.js index 513d36da2..58f5d11b2 100644 --- a/packages/client/webpack/create-config.js +++ b/packages/client/webpack/create-config.js @@ -1,43 +1,51 @@ -const path = require('path'); -const webpack = require('webpack'); -const { merge } = require('webpack-merge'); +import path from 'path' +import { fileURLToPath } from 'url' +import webpack from 'webpack' +import { merge } from 'webpack-merge' -module.exports = function createConfig (output, isProduction = false) { +const __dirname = path.dirname(fileURLToPath(import.meta.url)) + +export default function createConfig(output, isProduction = false) { const commons = { - entry: [ - `./src/${output}.ts` - ], + entry: [`./src/${output}.ts`], + experiments: { + outputModule: true + }, output: { - library: 'feathers', - libraryTarget: 'umd', + library: { + type: 'module' + }, globalObject: 'this', path: path.resolve(__dirname, '..', 'dist'), filename: `${output}.js` }, resolve: { - extensions: [ '.tsx', '.ts', '.js' ] + extensions: ['.tsx', '.ts', '.js'] }, module: { - rules: [{ - test: /\.tsx?$/, - use: 'ts-loader', - exclude: /node_modules/ - }, { - test: /\.js/, - exclude: /node_modules\/(?!(@feathersjs|debug))/, - loader: 'babel-loader', - options: { - presets: ['@babel/preset-env'] - // plugins: ['@babel/plugin-transform-classes'] + rules: [ + { + test: /\.tsx?$/, + use: 'ts-loader', + exclude: /node_modules/ + }, + { + test: /\.js/, + exclude: /node_modules\/(?!(@feathersjs|debug))/, + loader: 'babel-loader', + options: { + presets: ['@babel/preset-env'] + // plugins: ['@babel/plugin-transform-classes'] + } } - }] + ] } - }; + } const dev = { mode: 'development', devtool: 'source-map' - }; + } const production = { mode: 'production', output: { @@ -48,7 +56,7 @@ module.exports = function createConfig (output, isProduction = false) { 'process.env.NODE_ENV': JSON.stringify('production') }) ] - }; + } - return merge(commons, isProduction ? production : dev); + return merge(commons, isProduction ? production : dev) } diff --git a/packages/client/webpack/feathers.js b/packages/client/webpack/feathers.js index cf576327b..abc7f1a07 100644 --- a/packages/client/webpack/feathers.js +++ b/packages/client/webpack/feathers.js @@ -1,3 +1,3 @@ -const createConfig = require('./create-config'); +import createConfig from './create-config.js' -module.exports = createConfig('feathers'); \ No newline at end of file +export default createConfig('feathers') diff --git a/packages/client/webpack/feathers.min.js b/packages/client/webpack/feathers.min.js index 38e64abe7..d130266b2 100644 --- a/packages/client/webpack/feathers.min.js +++ b/packages/client/webpack/feathers.min.js @@ -1,3 +1,3 @@ -const createConfig = require('./create-config'); +import createConfig from './create-config.js' -module.exports = createConfig('feathers', true); \ No newline at end of file +export default createConfig('feathers', true) diff --git a/packages/commons/LICENSE b/packages/commons/LICENSE index 7712f870f..f9b502c69 100644 --- a/packages/commons/LICENSE +++ b/packages/commons/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2024 Feathers Contributors +Copyright (c) 2025 Feathers Contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -19,4 +19,3 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - diff --git a/packages/commons/README.md b/packages/commons/README.md index 2eefb2bb7..f232be878 100644 --- a/packages/commons/README.md +++ b/packages/commons/README.md @@ -18,6 +18,6 @@ Refer to the [Feathers API](https://feathersjs.com/api) for more details. ## License -Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) +Copyright (c) 2025 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) Licensed under the [MIT license](LICENSE). diff --git a/packages/commons/package.json b/packages/commons/package.json index bcffde63f..1804762a5 100644 --- a/packages/commons/package.json +++ b/packages/commons/package.json @@ -6,6 +6,7 @@ "keywords": [ "feathers" ], + "type": "module", "license": "MIT", "funding": { "type": "github", @@ -26,10 +27,9 @@ "url": "https://github.com/feathersjs/feathers/issues" }, "engines": { - "node": ">= 12" + "node": ">= 20" }, - "main": "lib/", - "types": "lib/", + "main": "lib/index.js", "files": [ "CHANGELOG.md", "LICENSE", @@ -59,5 +59,8 @@ "ts-node": "^10.9.2", "typescript": "^5.9.2" }, - "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" + "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5", + "dependencies": { + "feathers": "^6.0.0-pre.2" + } } diff --git a/packages/commons/src/debug.ts b/packages/commons/src/debug.ts deleted file mode 100644 index 5c15e62cf..000000000 --- a/packages/commons/src/debug.ts +++ /dev/null @@ -1,27 +0,0 @@ -/* eslint-disable @typescript-eslint/no-empty-function */ -export type DebugFunction = (...args: any[]) => void -export type DebugInitializer = (name: string) => DebugFunction - -const debuggers: { [key: string]: DebugFunction } = {} - -export function noopDebug(): DebugFunction { - return function () {} -} - -let defaultInitializer: DebugInitializer = noopDebug - -export function setDebug(debug: DebugInitializer) { - defaultInitializer = debug - - Object.keys(debuggers).forEach((name) => { - debuggers[name] = debug(name) - }) -} - -export function createDebug(name: string) { - if (!debuggers[name]) { - debuggers[name] = defaultInitializer(name) - } - - return (...args: any[]) => debuggers[name](...args) -} diff --git a/packages/commons/src/index.ts b/packages/commons/src/index.ts index 945525238..d8786c204 100644 --- a/packages/commons/src/index.ts +++ b/packages/commons/src/index.ts @@ -1,102 +1 @@ -// Removes all leading and trailing slashes from a path -export function stripSlashes(name: string) { - return name.replace(/^(\/+)|(\/+)$/g, '') -} - -export type KeyValueCallback = (value: any, key: string) => T - -// A set of lodash-y utility functions that use ES6 -export const _ = { - each(obj: any, callback: KeyValueCallback) { - if (obj && typeof obj.forEach === 'function') { - obj.forEach(callback) - } else if (_.isObject(obj)) { - Object.keys(obj).forEach((key) => callback(obj[key], key)) - } - }, - - some(value: any, callback: KeyValueCallback) { - return Object.keys(value) - .map((key) => [value[key], key]) - .some(([val, key]) => callback(val, key)) - }, - - every(value: any, callback: KeyValueCallback) { - return Object.keys(value) - .map((key) => [value[key], key]) - .every(([val, key]) => callback(val, key)) - }, - - keys(obj: any) { - return Object.keys(obj) - }, - - values(obj: any) { - return _.keys(obj).map((key) => obj[key]) - }, - - isMatch(obj: any, item: any) { - return _.keys(item).every((key) => obj[key] === item[key]) - }, - - isEmpty(obj: any) { - return _.keys(obj).length === 0 - }, - - isObject(item: any) { - return typeof item === 'object' && !Array.isArray(item) && item !== null - }, - - isObjectOrArray(value: any) { - return typeof value === 'object' && value !== null - }, - - extend(first: any, ...rest: any[]) { - return Object.assign(first, ...rest) - }, - - omit(obj: any, ...keys: string[]) { - const result = _.extend({}, obj) - keys.forEach((key) => delete result[key]) - return result - }, - - pick(source: any, ...keys: string[]) { - return keys.reduce((result: { [key: string]: any }, key) => { - if (source[key] !== undefined) { - result[key] = source[key] - } - - return result - }, {}) - }, - - // Recursively merge the source object into the target object - merge(target: any, source: any) { - if (_.isObject(target) && _.isObject(source)) { - Object.keys(source).forEach((key) => { - if (_.isObject(source[key])) { - if (!target[key]) { - Object.assign(target, { [key]: {} }) - } - - _.merge(target[key], source[key]) - } else { - Object.assign(target, { [key]: source[key] }) - } - }) - } - return target - } -} - -// Duck-checks if an object looks like a promise -export function isPromise(result: any) { - return _.isObject(result) && typeof result.then === 'function' -} - -export function createSymbol(name: string) { - return typeof Symbol !== 'undefined' ? Symbol.for(name) : name -} - -export * from './debug' +export * from 'feathers/commons' diff --git a/packages/commons/test/debug.test.ts b/packages/commons/test/debug.test.ts index 2089af9b0..0df36ba0b 100644 --- a/packages/commons/test/debug.test.ts +++ b/packages/commons/test/debug.test.ts @@ -1,5 +1,5 @@ import { strict as assert } from 'assert' -import { createDebug, setDebug, noopDebug } from '../src' +import { createDebug, setDebug, noopDebug } from '../src/index.js' const myDebug = createDebug('hello test') diff --git a/packages/commons/test/module.test.ts b/packages/commons/test/module.test.ts index 06198d039..46d4f1abb 100644 --- a/packages/commons/test/module.test.ts +++ b/packages/commons/test/module.test.ts @@ -1,16 +1,7 @@ import { strict as assert } from 'assert' -import { _ } from '../src' +import { _ } from '../src/index.js' describe('module', () => { - it('is commonjs compatible', () => { - // eslint-disable-next-line - const commons = require('../lib') - - assert.equal(typeof commons, 'object') - assert.equal(typeof commons.stripSlashes, 'function') - assert.equal(typeof commons._, 'object') - }) - it('exposes lodash methods under _', () => { assert.equal(typeof _.each, 'function') assert.equal(typeof _.some, 'function') diff --git a/packages/commons/test/utils.test.ts b/packages/commons/test/utils.test.ts index 53d51978a..80423b455 100644 --- a/packages/commons/test/utils.test.ts +++ b/packages/commons/test/utils.test.ts @@ -1,6 +1,6 @@ /* tslint:disable:no-unused-expression */ import { strict as assert } from 'assert' -import { _, stripSlashes, isPromise, createSymbol } from '../src' +import { _, stripSlashes, isPromise, createSymbol } from '../src/index.js' describe('@feathersjs/commons utils', () => { it('stripSlashes', () => { diff --git a/packages/configuration/LICENSE b/packages/configuration/LICENSE index 7712f870f..f9b502c69 100644 --- a/packages/configuration/LICENSE +++ b/packages/configuration/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2024 Feathers Contributors +Copyright (c) 2025 Feathers Contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -19,4 +19,3 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - diff --git a/packages/configuration/README.md b/packages/configuration/README.md index 6e81d7cdb..53e604c75 100644 --- a/packages/configuration/README.md +++ b/packages/configuration/README.md @@ -18,6 +18,6 @@ Refer to the [Feathers configuration API documentation](https://feathersjs.com/a ## License -Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) +Copyright (c) 2025 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) Licensed under the [MIT license](LICENSE). diff --git a/packages/configuration/package.json b/packages/configuration/package.json index 794233a42..5da5ddd57 100644 --- a/packages/configuration/package.json +++ b/packages/configuration/package.json @@ -3,8 +3,8 @@ "description": "A small configuration module for your Feathers application.", "version": "5.0.35", "homepage": "https://feathersjs.com", - "main": "lib/", - "types": "lib/", + "main": "lib/index.js", + "type": "module", "keywords": [ "feathers", "feathers-plugin" @@ -29,7 +29,7 @@ "url": "https://github.com/feathersjs/feathers/issues" }, "engines": { - "node": ">= 12" + "node": ">= 20" }, "files": [ "CHANGELOG.md", diff --git a/packages/configuration/src/index.ts b/packages/configuration/src/index.ts index a34606d67..17c64d1dd 100644 --- a/packages/configuration/src/index.ts +++ b/packages/configuration/src/index.ts @@ -1,11 +1,11 @@ -import { Application, ApplicationHookContext, NextFunction } from '@feathersjs/feathers' +import type { Application, ApplicationHookContext, NextFunction } from '@feathersjs/feathers' import { createDebug } from '@feathersjs/commons' -import { Schema, Validator } from '@feathersjs/schema' +import type { Schema, Validator } from '@feathersjs/schema' import config from 'config' const debug = createDebug('@feathersjs/configuration') -export = function init(schema?: Schema | Validator) { +export default function init(schema?: Schema | Validator) { const validator: Validator = typeof schema === 'function' ? schema : schema?.validate.bind(schema) return (app?: Application) => { diff --git a/packages/configuration/test/index.test.ts b/packages/configuration/test/index.test.ts index 65fc1c8d1..0128d0494 100644 --- a/packages/configuration/test/index.test.ts +++ b/packages/configuration/test/index.test.ts @@ -1,7 +1,8 @@ import { strict as assert } from 'assert' -import { feathers, Application } from '@feathersjs/feathers' +import type { Application } from '@feathersjs/feathers' +import { feathers } from '@feathersjs/feathers' import { Ajv, schema } from '@feathersjs/schema' -import configuration from '../src' +import configuration from '../src/index.js' describe('@feathersjs/configuration', () => { const app: Application = feathers().configure(configuration()) diff --git a/packages/create-feathers/CHANGELOG.md b/packages/create-feathers/CHANGELOG.md deleted file mode 100644 index 2e4823448..000000000 --- a/packages/create-feathers/CHANGELOG.md +++ /dev/null @@ -1,194 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. -See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. - -## [5.0.35](https://github.com/feathersjs/feathers/compare/v5.0.34...v5.0.35) (2025-09-09) - -**Note:** Version bump only for package create-feathers - -## [5.0.34](https://github.com/feathersjs/feathers/compare/v5.0.33...v5.0.34) (2025-05-03) - -**Note:** Version bump only for package create-feathers - -## [5.0.33](https://github.com/feathersjs/feathers/compare/v5.0.32...v5.0.33) (2025-02-24) - -**Note:** Version bump only for package create-feathers - -## [5.0.32](https://github.com/feathersjs/feathers/compare/v5.0.31...v5.0.32) (2025-02-01) - -**Note:** Version bump only for package create-feathers - -## [5.0.31](https://github.com/feathersjs/feathers/compare/v5.0.30...v5.0.31) (2024-10-31) - -**Note:** Version bump only for package create-feathers - -## [5.0.30](https://github.com/feathersjs/feathers/compare/v5.0.29...v5.0.30) (2024-09-02) - -**Note:** Version bump only for package create-feathers - -## [5.0.29](https://github.com/feathersjs/feathers/compare/v5.0.28...v5.0.29) (2024-07-10) - -**Note:** Version bump only for package create-feathers - -## [5.0.28](https://github.com/feathersjs/feathers/compare/v5.0.27...v5.0.28) (2024-07-10) - -**Note:** Version bump only for package create-feathers - -## [5.0.27](https://github.com/feathersjs/feathers/compare/v5.0.26...v5.0.27) (2024-06-18) - -**Note:** Version bump only for package create-feathers - -## [5.0.26](https://github.com/feathersjs/feathers/compare/v5.0.25...v5.0.26) (2024-06-09) - -**Note:** Version bump only for package create-feathers - -## [5.0.25](https://github.com/feathersjs/feathers/compare/v5.0.24...v5.0.25) (2024-05-03) - -**Note:** Version bump only for package create-feathers - -## [5.0.24](https://github.com/feathersjs/feathers/compare/v5.0.23...v5.0.24) (2024-03-13) - -**Note:** Version bump only for package create-feathers - -## [5.0.23](https://github.com/feathersjs/feathers/compare/v5.0.22...v5.0.23) (2024-02-25) - -**Note:** Version bump only for package create-feathers - -## [5.0.22](https://github.com/feathersjs/feathers/compare/v5.0.21...v5.0.22) (2024-02-15) - -**Note:** Version bump only for package create-feathers - -## [5.0.21](https://github.com/feathersjs/feathers/compare/v5.0.20...v5.0.21) (2024-01-25) - -**Note:** Version bump only for package create-feathers - -## [5.0.20](https://github.com/feathersjs/feathers/compare/v5.0.19...v5.0.20) (2024-01-24) - -**Note:** Version bump only for package create-feathers - -## [5.0.19](https://github.com/feathersjs/feathers/compare/v5.0.18...v5.0.19) (2024-01-23) - -### Bug Fixes - -- **cli:** Add JS extension to binaries ([#3398](https://github.com/feathersjs/feathers/issues/3398)) ([aaf181d](https://github.com/feathersjs/feathers/commit/aaf181d924d0cb67c7792a54197082c59109264d)) - -## [5.0.18](https://github.com/feathersjs/feathers/compare/v5.0.17...v5.0.18) (2024-01-22) - -**Note:** Version bump only for package create-feathers - -## [5.0.17](https://github.com/feathersjs/feathers/compare/v5.0.16...v5.0.17) (2024-01-22) - -**Note:** Version bump only for package create-feathers - -## [5.0.16](https://github.com/feathersjs/feathers/compare/v5.0.15...v5.0.16) (2024-01-22) - -### Bug Fixes - -- Update npm create feathers to ES module ([#3393](https://github.com/feathersjs/feathers/issues/3393)) ([314ce70](https://github.com/feathersjs/feathers/commit/314ce707332eadbea4505e5e7560397632da6205)) - -## [5.0.15](https://github.com/feathersjs/feathers/compare/v5.0.14...v5.0.15) (2024-01-22) - -**Note:** Version bump only for package create-feathers - -## [5.0.14](https://github.com/feathersjs/feathers/compare/v5.0.13...v5.0.14) (2024-01-05) - -**Note:** Version bump only for package create-feathers - -## [5.0.13](https://github.com/feathersjs/feathers/compare/v5.0.12...v5.0.13) (2023-12-29) - -**Note:** Version bump only for package create-feathers - -## [5.0.12](https://github.com/feathersjs/feathers/compare/v5.0.11...v5.0.12) (2023-11-28) - -**Note:** Version bump only for package create-feathers - -## [5.0.11](https://github.com/feathersjs/feathers/compare/v5.0.10...v5.0.11) (2023-10-11) - -**Note:** Version bump only for package create-feathers - -## [5.0.10](https://github.com/feathersjs/feathers/compare/v5.0.9...v5.0.10) (2023-10-03) - -**Note:** Version bump only for package create-feathers - -## [5.0.9](https://github.com/feathersjs/feathers/compare/v5.0.8...v5.0.9) (2023-09-27) - -**Note:** Version bump only for package create-feathers - -## [5.0.8](https://github.com/feathersjs/feathers/compare/v5.0.7...v5.0.8) (2023-07-19) - -**Note:** Version bump only for package create-feathers - -## [5.0.7](https://github.com/feathersjs/feathers/compare/v5.0.6...v5.0.7) (2023-07-14) - -**Note:** Version bump only for package create-feathers - -## [5.0.6](https://github.com/feathersjs/feathers/compare/v5.0.5...v5.0.6) (2023-06-15) - -**Note:** Version bump only for package create-feathers - -## [5.0.5](https://github.com/feathersjs/feathers/compare/v5.0.4...v5.0.5) (2023-04-28) - -**Note:** Version bump only for package create-feathers - -## [5.0.4](https://github.com/feathersjs/feathers/compare/v5.0.3...v5.0.4) (2023-04-12) - -### Bug Fixes - -- Make sure all Readme files are up to date ([#3154](https://github.com/feathersjs/feathers/issues/3154)) ([a5f0b38](https://github.com/feathersjs/feathers/commit/a5f0b38bbf2a11486415a39533bcc6c67fb51e3e)) - -## [5.0.3](https://github.com/feathersjs/feathers/compare/v5.0.2...v5.0.3) (2023-04-05) - -**Note:** Version bump only for package create-feathers - -## [5.0.2](https://github.com/feathersjs/feathers/compare/v5.0.1...v5.0.2) (2023-03-23) - -**Note:** Version bump only for package create-feathers - -## [5.0.1](https://github.com/feathersjs/feathers/compare/v5.0.0...v5.0.1) (2023-03-15) - -**Note:** Version bump only for package create-feathers - -# [5.0.0](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.38...v5.0.0) (2023-02-24) - -**Note:** Version bump only for package create-feathers - -# [5.0.0-pre.38](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.37...v5.0.0-pre.38) (2023-02-17) - -### Features - -- **generators:** Final tweaks to the generators ([#3060](https://github.com/feathersjs/feathers/issues/3060)) ([1bf1544](https://github.com/feathersjs/feathers/commit/1bf1544fa8deeaa44ba354fb539dc3f1fd187767)) - -# [5.0.0-pre.37](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.36...v5.0.0-pre.37) (2023-02-09) - -**Note:** Version bump only for package create-feathers - -# [5.0.0-pre.36](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.35...v5.0.0-pre.36) (2023-01-29) - -**Note:** Version bump only for package create-feathers - -# [5.0.0-pre.35](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.34...v5.0.0-pre.35) (2023-01-12) - -**Note:** Version bump only for package create-feathers - -# [5.0.0-pre.34](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.33...v5.0.0-pre.34) (2022-12-14) - -**Note:** Version bump only for package create-feathers - -# [5.0.0-pre.33](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.32...v5.0.0-pre.33) (2022-11-08) - -**Note:** Version bump only for package create-feathers - -# [5.0.0-pre.32](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.31...v5.0.0-pre.32) (2022-10-26) - -**Note:** Version bump only for package create-feathers - -# [5.0.0-pre.31](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.30...v5.0.0-pre.31) (2022-10-12) - -**Note:** Version bump only for package create-feathers - -# [5.0.0-pre.30](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.29...v5.0.0-pre.30) (2022-10-07) - -### Features - -- **cli:** Add ability to `npm init feathers` ([#2755](https://github.com/feathersjs/feathers/issues/2755)) ([d734931](https://github.com/feathersjs/feathers/commit/d734931ffd4f983a05d9e771ce0e43b696c2bc0e)) diff --git a/packages/create-feathers/README.md b/packages/create-feathers/README.md deleted file mode 100644 index 8c4afc3a1..000000000 --- a/packages/create-feathers/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# create-feathers - -[![CI](https://github.com/feathersjs/feathers/workflows/CI/badge.svg)](https://github.com/feathersjs/feathers/actions?query=workflow%3ACI) -[![Download Status](https://img.shields.io/npm/dm/@feathersjs/configuration.svg?style=flat-square)](https://www.npmjs.com/package/create-feathers) -[![Discord](https://badgen.net/badge/icon/discord?icon=discord&label)](https://discord.gg/qa8kez8QBx) - -> Generate a Feathers application through the CLI - -## Usage - -``` -npm create feathers my-app -``` - -## Documentation - -Refer to the [Feathers guides](https://feathersjs.com/guides/) for more details. - -## License - -Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) - -Licensed under the [MIT license](LICENSE). diff --git a/packages/create-feathers/bin/create-feathers.js b/packages/create-feathers/bin/create-feathers.js deleted file mode 100755 index 1c1bd6b10..000000000 --- a/packages/create-feathers/bin/create-feathers.js +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env node -'use strict'; - -import path from 'path' -import { existsSync } from 'fs' -import { mkdir } from 'fs/promises' -import { Command, commandRunner, chalk } from '@feathersjs/cli' - -const program = new Command() -const generateApp = commandRunner('app') - -program - .name('npm init feathers') - .description(`Create a new Feathers application 🕊️ - -${chalk.grey('npm init feathers myapp')} -`) - .argument('', 'The name of your new application') - // .version(version) - .showHelpAfterError() - .action(async (name, options) => { - try { - const cwd = path.join(process.cwd(), name) - - if (existsSync(cwd)) { - throw new Error(`Can not create Feathers application, the folder "${name}" already exists`) - } - - await mkdir(cwd) - - await generateApp({ - name, - cwd, - ...options - }) - - console.log(` - -${chalk.green('Hooray')}! Your Feathers app is ready to go! 🚀 -Go to the ${chalk.grey(name)} folder to get started. - -To learn more visit ${chalk.grey('https://feathersjs.com/guides')} -`) - } catch (error) { - console.error(`${chalk.red('Error')}: ${error.message}`) - process.exit(1) - } - }) - -program.parse() diff --git a/packages/create-feathers/package.json b/packages/create-feathers/package.json deleted file mode 100644 index ff50238f4..000000000 --- a/packages/create-feathers/package.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "name": "create-feathers", - "description": "Create a new Feathers application", - "version": "5.0.35", - "homepage": "https://feathersjs.com", - "bin": { - "create-feathers": "./bin/create-feathers.js" - }, - "type": "module", - "keywords": [ - "feathers", - "feathers-plugin" - ], - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/daffl" - }, - "repository": { - "type": "git", - "url": "git://github.com/feathersjs/feathers.git" - }, - "author": { - "name": "Feathers contributors", - "email": "hello@feathersjs.com", - "url": "https://feathersjs.com" - }, - "contributors": [], - "bugs": { - "url": "https://github.com/feathersjs/feathers/issues" - }, - "engines": { - "node": ">= 18" - }, - "files": [ - "CHANGELOG.md", - "LICENSE", - "README.md", - "lib/**", - "bin/**", - "*.d.ts", - "*.js" - ], - "scripts": { - "test": "bin/create-feathers.js --help" - }, - "publishConfig": { - "access": "public" - }, - "dependencies": { - "@feathersjs/cli": "^5.0.35" - }, - "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" -} diff --git a/packages/errors/LICENSE b/packages/errors/LICENSE index 7712f870f..f9b502c69 100644 --- a/packages/errors/LICENSE +++ b/packages/errors/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2024 Feathers Contributors +Copyright (c) 2025 Feathers Contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -19,4 +19,3 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - diff --git a/packages/errors/README.md b/packages/errors/README.md index 1b7612663..e65ddee39 100644 --- a/packages/errors/README.md +++ b/packages/errors/README.md @@ -18,6 +18,6 @@ Refer to the [Feathers errors API documentation](https://feathersjs.com/api/erro ## License -Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) +Copyright (c) 2025 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) Licensed under the [MIT license](LICENSE). diff --git a/packages/errors/package.json b/packages/errors/package.json index 998a1ff24..da508c79a 100644 --- a/packages/errors/package.json +++ b/packages/errors/package.json @@ -3,13 +3,13 @@ "description": "Common error types for Feathers apps", "version": "5.0.35", "homepage": "https://feathersjs.com", - "main": "lib/", - "types": "lib/", + "main": "lib/index.js", "keywords": [ "feathers", "feathers-plugin" ], "license": "MIT", + "type": "module", "repository": { "type": "git", "url": "git://github.com/feathersjs/feathers.git", @@ -25,7 +25,7 @@ "url": "https://github.com/feathersjs/feathers/issues" }, "engines": { - "node": ">= 12" + "node": ">= 20" }, "directories": { "lib": "lib" @@ -49,7 +49,6 @@ "*.js" ], "devDependencies": { - "@feathersjs/feathers": "^5.0.35", "@types/mocha": "^10.0.10", "@types/node": "^24.3.1", "mocha": "^11.7.2", @@ -57,5 +56,8 @@ "ts-node": "^10.9.2", "typescript": "^5.9.2" }, - "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" + "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5", + "dependencies": { + "feathers": "^6.0.0-pre.2" + } } diff --git a/packages/errors/src/index.ts b/packages/errors/src/index.ts index cca8761fd..53f597507 100644 --- a/packages/errors/src/index.ts +++ b/packages/errors/src/index.ts @@ -1,273 +1 @@ -export interface FeathersErrorJSON { - name: string - message: string - code: number - className: string - data?: any - errors?: any -} - -export type DynamicError = Error & { [key: string]: any } -export type ErrorMessage = null | string | DynamicError | { [key: string]: any } | any[] - -interface ErrorProperties extends Omit { - type: string -} - -export class FeathersError extends Error { - readonly type: string - readonly code: number - readonly className: string - readonly data: any - readonly errors: any - - constructor(err: ErrorMessage, name: string, code: number, className: string, _data: any) { - let msg = typeof err === 'string' ? err : 'Error' - const properties: ErrorProperties = { - name, - code, - className, - type: 'FeathersError' - } - - if (Array.isArray(_data)) { - properties.data = _data - } else if (typeof err === 'object' || _data !== undefined) { - const { message, errors, ...rest } = err !== null && typeof err === 'object' ? err : _data - - msg = message || msg - properties.errors = errors - properties.data = rest - } - - super(msg) - Object.assign(this, properties) - } - - toJSON() { - const result: FeathersErrorJSON = { - name: this.name, - message: this.message, - code: this.code, - className: this.className - } - - if (this.data !== undefined) { - result.data = this.data - } - - if (this.errors !== undefined) { - result.errors = this.errors - } - - return result - } -} - -export class BadRequest extends FeathersError { - constructor(message?: ErrorMessage, data?: any) { - super(message, 'BadRequest', 400, 'bad-request', data) - } -} - -// 401 - Not Authenticated -export class NotAuthenticated extends FeathersError { - constructor(message?: ErrorMessage, data?: any) { - super(message, 'NotAuthenticated', 401, 'not-authenticated', data) - } -} - -// 402 - Payment Error -export class PaymentError extends FeathersError { - constructor(message?: ErrorMessage, data?: any) { - super(message, 'PaymentError', 402, 'payment-error', data) - } -} - -// 403 - Forbidden -export class Forbidden extends FeathersError { - constructor(message?: ErrorMessage, data?: any) { - super(message, 'Forbidden', 403, 'forbidden', data) - } -} - -// 404 - Not Found -export class NotFound extends FeathersError { - constructor(message?: ErrorMessage, data?: any) { - super(message, 'NotFound', 404, 'not-found', data) - } -} - -// 405 - Method Not Allowed -export class MethodNotAllowed extends FeathersError { - constructor(message?: ErrorMessage, data?: any) { - super(message, 'MethodNotAllowed', 405, 'method-not-allowed', data) - } -} - -// 406 - Not Acceptable -export class NotAcceptable extends FeathersError { - constructor(message?: ErrorMessage, data?: any) { - super(message, 'NotAcceptable', 406, 'not-acceptable', data) - } -} - -// 408 - Timeout -export class Timeout extends FeathersError { - constructor(message?: ErrorMessage, data?: any) { - super(message, 'Timeout', 408, 'timeout', data) - } -} - -// 409 - Conflict -export class Conflict extends FeathersError { - constructor(message?: ErrorMessage, data?: any) { - super(message, 'Conflict', 409, 'conflict', data) - } -} - -// 410 - Gone -export class Gone extends FeathersError { - constructor(message?: ErrorMessage, data?: any) { - super(message, 'Gone', 410, 'gone', data) - } -} - -// 411 - Length Required -export class LengthRequired extends FeathersError { - constructor(message?: ErrorMessage, data?: any) { - super(message, 'LengthRequired', 411, 'length-required', data) - } -} - -// 422 Unprocessable -export class Unprocessable extends FeathersError { - constructor(message?: ErrorMessage, data?: any) { - super(message, 'Unprocessable', 422, 'unprocessable', data) - } -} - -// 429 Too Many Requests -export class TooManyRequests extends FeathersError { - constructor(message?: ErrorMessage, data?: any) { - super(message, 'TooManyRequests', 429, 'too-many-requests', data) - } -} - -// 500 - General Error -export class GeneralError extends FeathersError { - constructor(message?: ErrorMessage, data?: any) { - super(message, 'GeneralError', 500, 'general-error', data) - } -} - -// 501 - Not Implemented -export class NotImplemented extends FeathersError { - constructor(message?: ErrorMessage, data?: any) { - super(message, 'NotImplemented', 501, 'not-implemented', data) - } -} - -// 502 - Bad Gateway -export class BadGateway extends FeathersError { - constructor(message?: ErrorMessage, data?: any) { - super(message, 'BadGateway', 502, 'bad-gateway', data) - } -} - -// 503 - Unavailable -export class Unavailable extends FeathersError { - constructor(message?: ErrorMessage, data?: any) { - super(message, 'Unavailable', 503, 'unavailable', data) - } -} - -export interface Errors { - FeathersError: FeathersError - BadRequest: BadRequest - NotAuthenticated: NotAuthenticated - PaymentError: PaymentError - Forbidden: Forbidden - NotFound: NotFound - MethodNotAllowed: MethodNotAllowed - NotAcceptable: NotAcceptable - Timeout: Timeout - Conflict: Conflict - LengthRequired: LengthRequired - Unprocessable: Unprocessable - TooManyRequests: TooManyRequests - GeneralError: GeneralError - NotImplemented: NotImplemented - BadGateway: BadGateway - Unavailable: Unavailable - 400: BadRequest - 401: NotAuthenticated - 402: PaymentError - 403: Forbidden - 404: NotFound - 405: MethodNotAllowed - 406: NotAcceptable - 408: Timeout - 409: Conflict - 411: LengthRequired - 422: Unprocessable - 429: TooManyRequests - 500: GeneralError - 501: NotImplemented - 502: BadGateway - 503: Unavailable -} - -export const errors = { - FeathersError, - BadRequest, - NotAuthenticated, - PaymentError, - Forbidden, - NotFound, - MethodNotAllowed, - NotAcceptable, - Timeout, - Conflict, - LengthRequired, - Unprocessable, - TooManyRequests, - GeneralError, - NotImplemented, - BadGateway, - Unavailable, - 400: BadRequest, - 401: NotAuthenticated, - 402: PaymentError, - 403: Forbidden, - 404: NotFound, - 405: MethodNotAllowed, - 406: NotAcceptable, - 408: Timeout, - 409: Conflict, - 410: Gone, - 411: LengthRequired, - 422: Unprocessable, - 429: TooManyRequests, - 500: GeneralError, - 501: NotImplemented, - 502: BadGateway, - 503: Unavailable -} - -export function convert(error: any) { - if (!error) { - return error - } - - const FeathersError = (errors as any)[error.name] - const result = FeathersError - ? new FeathersError(error.message, error.data) - : new Error(error.message || error) - - if (typeof error === 'object') { - Object.assign(result, error) - } - - return result -} +export * from 'feathers/errors' diff --git a/packages/errors/test/index.test.ts b/packages/errors/test/index.test.ts index e4a026310..2f1409133 100644 --- a/packages/errors/test/index.test.ts +++ b/packages/errors/test/index.test.ts @@ -1,5 +1,5 @@ import assert from 'assert' -import * as errors from '../src' +import * as errors from '../src/index.js' const { convert } = errors diff --git a/packages/express/LICENSE b/packages/express/LICENSE index 7839c824d..f9b502c69 100644 --- a/packages/express/LICENSE +++ b/packages/express/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2024 Feathers Contributors +Copyright (c) 2025 Feathers Contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/packages/express/README.md b/packages/express/README.md index 9c6a22184..f99e1480d 100644 --- a/packages/express/README.md +++ b/packages/express/README.md @@ -18,6 +18,6 @@ Refer to the [Feathers Express API documentation](https://feathersjs.com/api/exp ## License -Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) +Copyright (c) 2025 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) Licensed under the [MIT license](LICENSE). diff --git a/packages/express/package.json b/packages/express/package.json index 66cc6353d..58a0d0105 100644 --- a/packages/express/package.json +++ b/packages/express/package.json @@ -3,8 +3,8 @@ "description": "Feathers Express framework bindings and REST provider", "version": "5.0.35", "homepage": "https://feathersjs.com", - "main": "lib/", - "types": "lib/", + "main": "lib/index.js", + "type": "module", "keywords": [ "feathers", "feathers-plugin" @@ -29,7 +29,7 @@ "url": "https://github.com/feathersjs/feathers/issues" }, "engines": { - "node": ">= 12" + "node": ">= 20" }, "files": [ "CHANGELOG.md", @@ -59,11 +59,9 @@ "@feathersjs/transport-commons": "^5.0.35", "@types/compression": "^1.8.1", "@types/cors": "^2.8.19", - "@types/express": "^4.17.21", - "@types/express-serve-static-core": "^4.19.5", "compression": "^1.8.1", "cors": "^2.8.5", - "express": "^4.21.2" + "express": "^5.1.0" }, "devDependencies": { "@feathersjs/authentication-local": "^5.0.35", @@ -72,7 +70,7 @@ "@types/mocha": "^10.0.10", "@types/node": "^24.3.1", "axios": "^1.11.0", - "lodash": "^4.17.21", + "lodash-es": "^4.17.21", "mocha": "^11.7.2", "shx": "^0.4.0", "ts-node": "^10.9.2", diff --git a/packages/express/src/authentication.ts b/packages/express/src/authentication.ts index 519e7e32e..c80d9521b 100644 --- a/packages/express/src/authentication.ts +++ b/packages/express/src/authentication.ts @@ -1,10 +1,9 @@ -import { RequestHandler, Request, Response } from 'express' -import { HookContext } from '@feathersjs/feathers' +import type { RequestHandler, Request, Response } from 'express' +import type { HookContext } from '@feathersjs/feathers' import { createDebug } from '@feathersjs/commons' import { authenticate as AuthenticateHook } from '@feathersjs/authentication' -import { Application } from './declarations' - +import type { Application } from './declarations.js' const debug = createDebug('@feathersjs/express/authentication') const toHandler = ( diff --git a/packages/express/src/declarations.ts b/packages/express/src/declarations.ts index d4f7a34af..99a645ffd 100644 --- a/packages/express/src/declarations.ts +++ b/packages/express/src/declarations.ts @@ -1,6 +1,6 @@ import http from 'http' import express, { Express } from 'express' -import { +import type { Application as FeathersApplication, Params as FeathersParams, HookContext, @@ -8,7 +8,6 @@ import { ServiceInterface, RouteLookup } from '@feathersjs/feathers' - interface ExpressUseHandler { ( path: L, @@ -37,7 +36,7 @@ export type Application = Omit & ExpressOverrides -declare module '@feathersjs/feathers/lib/declarations' { +declare module '@feathersjs/feathers' { interface ServiceOptions { express?: { before?: express.RequestHandler[] diff --git a/packages/express/src/handlers.ts b/packages/express/src/handlers.ts index 73c162759..0738c714f 100644 --- a/packages/express/src/handlers.ts +++ b/packages/express/src/handlers.ts @@ -1,6 +1,10 @@ import path from 'path' import { NotFound, GeneralError } from '@feathersjs/errors' -import { Request, Response, NextFunction, ErrorRequestHandler, RequestHandler } from 'express' +import type { NextFunction } from 'express' +import { Request, Response, ErrorRequestHandler, RequestHandler } from 'express' +import { fileURLToPath } from 'url' + +const __dirname = path.dirname(fileURLToPath(import.meta.url)) const defaults = { public: path.resolve(__dirname, '..', 'public'), diff --git a/packages/express/src/index.ts b/packages/express/src/index.ts index 675ae253d..2c276667e 100644 --- a/packages/express/src/index.ts +++ b/packages/express/src/index.ts @@ -1,24 +1,16 @@ import express, { Express } from 'express' -import { Application as FeathersApplication, defaultServiceMethods } from '@feathersjs/feathers' -import { routing } from '@feathersjs/transport-commons' +import type { Application as FeathersApplication } from '@feathersjs/feathers' +import { defaultServiceMethods } from '@feathersjs/feathers' import { createDebug } from '@feathersjs/commons' import cors from 'cors' import compression from 'compression' -import { rest, RestOptions, formatter } from './rest' -import { errorHandler, notFound, ErrorHandlerOptions } from './handlers' -import { Application, ExpressOverrides } from './declarations' -import { AuthenticationSettings, authenticate, parseAuthentication } from './authentication' -import { - default as original, - static as serveStatic, - json, - raw, - text, - urlencoded, - query, - Router -} from 'express' +import { rest, RestOptions, formatter } from './rest.js' +import { errorHandler, notFound, ErrorHandlerOptions } from './handlers.js' +import type { Application } from './declarations.js' +import { ExpressOverrides } from './declarations.js' +import { AuthenticationSettings, authenticate, parseAuthentication } from './authentication.js' +import { default as original, static as serveStatic, json, raw, text, urlencoded, Router } from 'express' export { original, @@ -28,7 +20,6 @@ export { raw, text, urlencoded, - query, rest, Router, RestOptions, @@ -63,6 +54,8 @@ export default function feathersExpress( const { use: expressUse, listen: expressListen } = expressApp as any const { use: feathersUse, teardown: feathersTeardown } = feathersApp + expressApp.set('query parser', 'extended') + Object.assign(app, { use(location: string & keyof S, ...rest: any[]) { let service: any @@ -125,12 +118,16 @@ export default function feathersExpress( ...Object.getOwnPropertyDescriptors(Object.getPrototypeOf(feathersApp)), ...Object.getOwnPropertyDescriptors(feathersApp) } + const keys = [ + ...Object.getOwnPropertyNames(newDescriptors), + ...Object.getOwnPropertySymbols(newDescriptors) + ] // Copy all non-existing properties (including non-enumerables) // that don't already exist on the Express app - Object.keys(newDescriptors).forEach((prop) => { - const appProp = appDescriptors[prop] - const newProp = newDescriptors[prop] + keys.forEach((prop) => { + const appProp = appDescriptors[prop as string] + const newProp = newDescriptors[prop as string] if (appProp === undefined && newProp !== undefined) { Object.defineProperty(expressApp, prop, newProp) @@ -152,7 +149,6 @@ export default function feathersExpress( ) } - app.configure(routing() as any) app.use((req, _res, next) => { req.feathers = { ...req.feathers, provider: 'rest' } return next() diff --git a/packages/express/src/rest.ts b/packages/express/src/rest.ts index 6b4cc1c9d..6a45c5c0e 100644 --- a/packages/express/src/rest.ts +++ b/packages/express/src/rest.ts @@ -4,9 +4,8 @@ import { createDebug } from '@feathersjs/commons' import { http } from '@feathersjs/transport-commons' import { createContext, defaultServiceMethods, getServiceOptions } from '@feathersjs/feathers' -import { AuthenticationSettings, parseAuthentication } from './authentication' -import { Application } from './declarations' - +import { AuthenticationSettings, parseAuthentication } from './authentication.js' +import type { Application } from './declarations.js' const debug = createDebug('@feathersjs/express/rest') const toHandler = ( @@ -65,7 +64,7 @@ const servicesMiddleware = (): RequestHandler => { const options = getServiceOptions(lookup.service) const middleware = options.express.composed - return middleware(req, res, next) + middleware(req, res, next) }) } diff --git a/packages/express/test/authentication.test.ts b/packages/express/test/authentication.test.ts index a821c1517..35fb68512 100644 --- a/packages/express/test/authentication.test.ts +++ b/packages/express/test/authentication.test.ts @@ -1,11 +1,12 @@ /* eslint-disable @typescript-eslint/ban-ts-comment */ -import omit from 'lodash/omit' +import { omit } from 'lodash-es' import { strict as assert } from 'assert' import { default as _axios } from 'axios' import { feathers } from '@feathersjs/feathers' -import { createApplication } from '@feathersjs/authentication-local/test/fixture' -import { authenticate, AuthenticationResult } from '@feathersjs/authentication' -import * as express from '../src' +import type { AuthenticationResult } from '@feathersjs/authentication' +import { authenticate } from '@feathersjs/authentication' +import { createApplication } from './fixture.js' +import * as express from '../src/index.js' const expressify = express.default const axios = _axios.create({ diff --git a/packages/express/test/error-handler.test.ts b/packages/express/test/error-handler.test.ts index e12b653d8..563f3913f 100644 --- a/packages/express/test/error-handler.test.ts +++ b/packages/express/test/error-handler.test.ts @@ -1,12 +1,14 @@ /* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/no-empty-function */ import { strict as assert } from 'assert' -import express, { Request, Response, NextFunction } from 'express' +import express from 'express' +import type { Request, Response, NextFunction } from 'express' import axios from 'axios' import fs from 'fs' -import { join } from 'path' +import { join, dirname } from 'path' import { BadRequest, NotAcceptable, NotAuthenticated, NotFound, PaymentError } from '@feathersjs/errors' -import { errorHandler } from '../src' +import { errorHandler } from '../src/index.js' +import { fileURLToPath } from 'url' const content = 'Error' @@ -18,6 +20,8 @@ const jsonHandler = function (error: Error, _req: Request, res: Response, _next: res.json(error) } +const __dirname = dirname(fileURLToPath(import.meta.url)) + describe('error-handler', () => { describe('supports catch-all custom handlers', function () { before(function () { diff --git a/packages/express/test/fixture.ts b/packages/express/test/fixture.ts new file mode 100644 index 000000000..c53bf1128 --- /dev/null +++ b/packages/express/test/fixture.ts @@ -0,0 +1,62 @@ +import { feathers } from '@feathersjs/feathers' +import { memory, MemoryService } from '@feathersjs/memory' +import { AuthenticationService, JWTStrategy } from '@feathersjs/authentication' +import { LocalStrategy, hooks } from '@feathersjs/authentication-local' +const { hashPassword, protect } = hooks + +export type ServiceTypes = { + authentication: AuthenticationService + users: MemoryService +} + +export function createApplication( + app = feathers(), + authOptionOverrides: Record = {} +) { + const authentication = new AuthenticationService(app) + + const authConfig = { + entity: 'user', + service: 'users', + secret: 'supersecret', + authStrategies: ['local', 'jwt'], + parseStrategies: ['jwt'], + local: { + usernameField: 'email', + passwordField: 'password' + }, + ...authOptionOverrides + } + app.set('authentication', authConfig) + + authentication.register('jwt', new JWTStrategy()) + authentication.register('local', new LocalStrategy()) + + app.use('authentication', authentication) + app.use( + 'users', + memory({ + multi: ['create'], + paginate: { + default: 10, + max: 20 + } + }) + ) + + app.service('users').hooks([protect(authConfig.local.passwordField)]) + app.service('users').hooks({ + create: [hashPassword(authConfig.local.passwordField)], + get: [ + async (context, next) => { + await next() + + if (context.params.provider) { + context.result.fromGet = true + } + } + ] + }) + + return app +} diff --git a/packages/express/test/index.test.ts b/packages/express/test/index.test.ts index b22566f22..474dfc224 100644 --- a/packages/express/test/index.test.ts +++ b/packages/express/test/index.test.ts @@ -1,14 +1,27 @@ /* eslint-disable @typescript-eslint/ban-ts-comment */ import { strict as assert } from 'assert' -import express, { Request, Response, NextFunction } from 'express' +import express from 'express' +import type { Request, Response, NextFunction } from 'express' import axios from 'axios' import fs from 'fs' import path from 'path' import https from 'https' -import { feathers, HookContext, Id } from '@feathersjs/feathers' - -import { default as feathersExpress, rest, notFound, errorHandler, original, serveStatic } from '../src' -import { RequestListener } from 'http' +import type { HookContext, Id } from '@feathersjs/feathers' +import { feathers } from '@feathersjs/feathers' +import type { RequestListener } from 'http' +import { fileURLToPath } from 'url' + +import { + default as feathersExpress, + rest, + notFound, + errorHandler, + original, + serveStatic +} from '../src/index.js' + +// Set __dirname in es module +const __dirname = path.dirname(fileURLToPath(import.meta.url)) describe('@feathersjs/express', () => { const service = { diff --git a/packages/express/test/not-found-handler.test.ts b/packages/express/test/not-found-handler.test.ts index 89db3cf1b..1e8be6140 100644 --- a/packages/express/test/not-found-handler.test.ts +++ b/packages/express/test/not-found-handler.test.ts @@ -1,7 +1,7 @@ import { strict as assert } from 'assert' import { NotFound } from '@feathersjs/errors' -import { notFound } from '../src' +import { notFound } from '../src/index.js' const handler = notFound as any diff --git a/packages/express/test/rest.test.ts b/packages/express/test/rest.test.ts index ddc9ff857..ba7719b22 100644 --- a/packages/express/test/rest.test.ts +++ b/packages/express/test/rest.test.ts @@ -1,14 +1,16 @@ /* eslint-disable @typescript-eslint/no-unused-vars */ import { strict as assert } from 'assert' -import axios, { AxiosRequestConfig } from 'axios' +import axios, { type AxiosRequestConfig } from 'axios' import { Server } from 'http' -import { Request, Response, NextFunction } from 'express' -import { ApplicationHookMap, feathers, HookContext, Id, Params } from '@feathersjs/feathers' -import { Service, restTests } from '@feathersjs/tests' +import type { NextFunction, Request, Response } from 'express' +import type { ApplicationHookMap, HookContext, Id, Params } from '@feathersjs/feathers' +import { feathers } from '@feathersjs/feathers' +import { Service } from '@feathersjs/tests' +import { restTests } from '@feathersjs/tests' import { BadRequest } from '@feathersjs/errors' -import * as express from '../src' +import * as express from '../src/index.js' const expressify = express.default const { rest } = express diff --git a/packages/feathers/LICENSE b/packages/feathers/LICENSE index 7712f870f..f9b502c69 100644 --- a/packages/feathers/LICENSE +++ b/packages/feathers/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2024 Feathers Contributors +Copyright (c) 2025 Feathers Contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -19,4 +19,3 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - diff --git a/packages/feathers/README.md b/packages/feathers/README.md index ecc774770..bbfeb560f 100644 --- a/packages/feathers/README.md +++ b/packages/feathers/README.md @@ -26,6 +26,6 @@ To learn more about Feathers visit the website at [feathersjs.com](http://feathe ## License -Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) +Copyright (c) 2025 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) Licensed under the [MIT license](LICENSE). diff --git a/packages/feathers/package.json b/packages/feathers/package.json index 83750365e..a351066ab 100644 --- a/packages/feathers/package.json +++ b/packages/feathers/package.json @@ -14,8 +14,8 @@ "socket.io", "realtime" ], - "main": "lib/", - "types": "lib/", + "type": "module", + "main": "lib/index.js", "author": { "name": "Feathers contributors", "email": "hello@feathersjs.com", @@ -42,25 +42,19 @@ "*.js" ], "scripts": { - "write-version": "node -e \"console.log('export default \\'' + require('./package.json').version + '\\'')\" > src/version.ts", - "reset-version": "node -e \"console.log('export default \\'development\\'')\" > src/version.ts", "prepublish": "npm run compile", - "version": "npm run write-version", - "publish": "npm run reset-version", "pack": "npm pack --pack-destination ../generators/test/build", "compile": "shx rm -rf lib/ && tsc && npm run pack", "test": "mocha --config ../../.mocharc.json --recursive test/" }, "engines": { - "node": ">= 12" + "node": ">= 20" }, "publishConfig": { "access": "public" }, "dependencies": { - "@feathersjs/commons": "^5.0.35", - "@feathersjs/hooks": "^0.9.0", - "events": "^3.3.0" + "feathers": "^6.0.0-pre.2" }, "devDependencies": { "@types/mocha": "^10.0.10", diff --git a/packages/feathers/src/application.ts b/packages/feathers/src/application.ts deleted file mode 100644 index 6abf661b1..000000000 --- a/packages/feathers/src/application.ts +++ /dev/null @@ -1,224 +0,0 @@ -import version from './version' -import { EventEmitter } from 'events' -import { stripSlashes, createDebug } from '@feathersjs/commons' -import { HOOKS, hooks, middleware } from '@feathersjs/hooks' -import { eventHook, eventMixin } from './events' -import { hookMixin } from './hooks' -import { wrapService, getServiceOptions, protectedMethods } from './service' -import { - FeathersApplication, - ServiceMixin, - Service, - ServiceOptions, - ServiceInterface, - Application, - FeathersService, - ApplicationHookOptions -} from './declarations' -import { enableHooks } from './hooks' - -const debug = createDebug('@feathersjs/feathers') - -export class Feathers - extends EventEmitter - implements FeathersApplication -{ - services: Services = {} as Services - settings: Settings = {} as Settings - mixins: ServiceMixin>[] = [hookMixin, eventMixin] - version: string = version - _isSetup = false - - protected registerHooks: (this: any, allHooks: any) => any - - constructor() { - super() - this.registerHooks = enableHooks(this) - this.registerHooks({ - around: [eventHook] - }) - } - - get(name: L): Settings[L] { - return this.settings[name] - } - - set(name: L, value: Settings[L]) { - this.settings[name] = value - return this - } - - configure(callback: (this: this, app: this) => void) { - callback.call(this, this) - - return this - } - - defaultService(location: string): ServiceInterface { - throw new Error(`Can not find service '${location}'`) - } - - service( - location: L - ): FeathersService { - const path = (stripSlashes(location) || '/') as L - const current = this.services.hasOwnProperty(path) ? this.services[path] : undefined - - if (typeof current === 'undefined') { - this.use(path, this.defaultService(path) as any) - return this.service(path) - } - - return current as any - } - - protected _setup() { - this._isSetup = true - - return Object.keys(this.services) - .reduce( - (current, path) => - current.then(() => { - const service: any = this.service(path as any) - - if (typeof service.setup === 'function') { - debug(`Setting up service for \`${path}\``) - - return service.setup(this, path) - } - }), - Promise.resolve() - ) - .then(() => this) - } - - get setup() { - return this._setup - } - - set setup(value) { - this._setup = (value as any)[HOOKS] - ? value - : hooks( - value, - middleware().params('server').props({ - app: this - }) - ) - } - - protected _teardown() { - this._isSetup = false - - return Object.keys(this.services) - .reduce( - (current, path) => - current.then(() => { - const service: any = this.service(path as any) - - if (typeof service.teardown === 'function') { - debug(`Tearing down service for \`${path}\``) - - return service.teardown(this, path) - } - }), - Promise.resolve() - ) - .then(() => this) - } - - get teardown() { - return this._teardown - } - - set teardown(value) { - this._teardown = (value as any)[HOOKS] - ? value - : hooks( - value, - middleware().params('server').props({ - app: this - }) - ) - } - - use( - path: L, - service: keyof any extends keyof Services ? ServiceInterface | Application : Services[L], - options?: ServiceOptions - ): this { - if (typeof path !== 'string') { - throw new Error(`'${path}' is not a valid service path.`) - } - - const location = (stripSlashes(path) || '/') as L - const subApp = service as Application - const isSubApp = typeof subApp.service === 'function' && subApp.services - - if (isSubApp) { - Object.keys(subApp.services).forEach((subPath) => - this.use(`${location}/${subPath}` as any, subApp.service(subPath) as any) - ) - - return this - } - - const protoService = wrapService(location, service, options as ServiceOptions) - const serviceOptions = getServiceOptions(protoService) - - for (const name of protectedMethods) { - if (serviceOptions.methods.includes(name)) { - throw new Error(`'${name}' on service '${location}' is not allowed as a custom method name`) - } - } - - debug(`Registering new service at \`${location}\``) - - // Add all the mixins - this.mixins.forEach((fn) => fn.call(this, protoService, location, serviceOptions)) - - this.services[location] = protoService - - // If we ran setup already, set this service up explicitly, this will not `await` - if (this._isSetup && typeof protoService.setup === 'function') { - debug(`Setting up service for \`${location}\``) - protoService.setup(this, location) - } - - return this - } - - async unuse( - location: L - ): Promise> { - const path = (stripSlashes(location) || '/') as L - const service = this.services[path] as Service - - if (service && typeof service.teardown === 'function') { - await service.teardown(this as any, path) - } - - delete this.services[path] - - return service as any - } - - hooks(hookMap: ApplicationHookOptions) { - const untypedMap = hookMap as any - - if (untypedMap.before || untypedMap.after || untypedMap.error || untypedMap.around) { - // regular hooks for all service methods - this.registerHooks(untypedMap) - } else if (untypedMap.setup || untypedMap.teardown) { - // .setup and .teardown application hooks - hooks(this, untypedMap) - } else { - // Other registration formats are just `around` hooks - this.registerHooks({ - around: untypedMap - }) - } - - return this - } -} diff --git a/packages/feathers/src/declarations.ts b/packages/feathers/src/declarations.ts deleted file mode 100644 index aece46eeb..000000000 --- a/packages/feathers/src/declarations.ts +++ /dev/null @@ -1,495 +0,0 @@ -import { EventEmitter } from 'events' -import { NextFunction, HookContext as BaseHookContext } from '@feathersjs/hooks' - -type SelfOrArray = S | S[] -type OptionalPick = Pick> -type Entries = { - [K in keyof T]: [K, T[K]] -}[keyof T][] -type GetKeyByValue = Extract[number], [PropertyKey, Value]>[0] - -export type { NextFunction } - -/** - * The object returned from `.find` call by standard database adapters - */ -export interface Paginated { - total: number - limit: number - skip: number - data: T[] -} - -/** - * Options that can be passed when registering a service via `app.use(name, service, options)` - */ -export interface ServiceOptions { - /** - * A list of custom events that this service emits to clients - */ - events?: string[] | readonly string[] - /** - * A list of service methods that should be available __externally__ to clients - */ - methods?: MethodTypes[] | readonly MethodTypes[] - /** - * Provide a full list of events that this service should emit to clients. - * Unlike the `events` option, this will not be merged with the default events. - */ - serviceEvents?: string[] | readonly string[] - /** - * Initial data to always add as route params to this service. - */ - routeParams?: { [key: string]: any } -} - -export interface ClientService< - Result = any, - Data = Partial, - PatchData = Data, - FindResult = Paginated, - P = Params -> { - find(params?: P): Promise - - get(id: Id, params?: P): Promise - - create(data: Data[], params?: P): Promise - create(data: Data, params?: P): Promise - - update(id: Id, data: Data, params?: P): Promise - update(id: NullableId, data: Data, params?: P): Promise - update(id: null, data: Data, params?: P): Promise - - patch(id: NullableId, data: PatchData, params?: P): Promise - patch(id: Id, data: PatchData, params?: P): Promise - patch(id: null, data: PatchData, params?: P): Promise - - remove(id: NullableId, params?: P): Promise - remove(id: Id, params?: P): Promise - remove(id: null, params?: P): Promise -} - -export interface ServiceMethods< - Result = any, - Data = Partial, - ServiceParams = Params, - PatchData = Partial -> { - find(params?: ServiceParams & { paginate?: PaginationParams }): Promise - - get(id: Id, params?: ServiceParams): Promise - - create(data: Data, params?: ServiceParams): Promise - - update(id: NullableId, data: Data, params?: ServiceParams): Promise - - patch(id: NullableId, data: PatchData, params?: ServiceParams): Promise - - remove(id: NullableId, params?: ServiceParams): Promise - - setup?(app: Application, path: string): Promise - - teardown?(app: Application, path: string): Promise -} - -export interface ServiceOverloads< - Result = any, - Data = Partial, - ServiceParams = Params, - PatchData = Partial -> { - create?(data: Data[], params?: ServiceParams): Promise - - update?(id: Id, data: Data, params?: ServiceParams): Promise - - update?(id: null, data: Data, params?: ServiceParams): Promise - - patch?(id: Id, data: PatchData, params?: ServiceParams): Promise - - patch?(id: null, data: PatchData, params?: ServiceParams): Promise - - remove?(id: Id, params?: ServiceParams): Promise - - remove?(id: null, params?: ServiceParams): Promise -} - -/** - * A complete service interface. The `ServiceInterface` type should be preferred for customs service - * implementations - */ -export type Service< - Result = any, - Data = Partial, - ServiceParams = Params, - PatchData = Partial -> = ServiceMethods & ServiceOverloads - -/** - * The `Service` service interface but with none of the methods required. - */ -export type ServiceInterface< - Result = any, - Data = Partial, - ServiceParams = Params, - PatchData = Partial -> = Partial> - -export interface ServiceAddons extends EventEmitter { - id?: string - hooks(options: HookOptions): this -} - -export interface ServiceHookOverloads { - find(params: P & { paginate?: PaginationParams }, context: HookContext): Promise - - get(id: Id, params: P, context: HookContext): Promise - - create( - data: ServiceGenericData | ServiceGenericData[], - params: P, - context: HookContext - ): Promise - - update(id: NullableId, data: ServiceGenericData, params: P, context: HookContext): Promise - - patch(id: NullableId, data: ServiceGenericData, params: P, context: HookContext): Promise - - remove(id: NullableId, params: P, context: HookContext): Promise -} - -export type FeathersService = S & - ServiceAddons & - OptionalPick, keyof S> - -export type CustomMethods = { - [K in keyof T]: (data: T[K][0], params?: Params) => Promise -} - -/** - * An interface usually use by transport clients that represents a e.g. HTTP or websocket - * connection that can be configured on the application. - */ -export type TransportConnection = { - (app: Application): void - Service: any - service: ( - name: L - ) => keyof any extends keyof Services ? ServiceInterface : Services[L] -} - -/** - * A real-time connection object - */ -export interface RealTimeConnection { - [key: string]: any -} - -/** - * The interface for a custom service method. Can e.g. be used to type client side services. - */ -export type CustomMethod = (data: T, params?: P) => Promise - -export type ServiceMixin = (service: FeathersService, path: string, options: ServiceOptions) => void - -export type ServiceGenericType = S extends ServiceInterface ? T : any -export type ServiceGenericData = S extends ServiceInterface ? D : any -export type ServiceGenericParams = S extends ServiceInterface ? P : any - -export interface FeathersApplication { - /** - * The Feathers application version - */ - version: string - - /** - * A list of callbacks that run when a new service is registered - */ - mixins: ServiceMixin>[] - - /** - * The index of all services keyed by their path. - * - * __Important:__ Services should always be retrieved via `app.service('name')` - * not via `app.services`. - */ - services: Services - - /** - * The application settings that can be used via - * `app.get` and `app.set` - */ - settings: Settings - - /** - * A private-ish indicator if `app.setup()` has been called already - */ - _isSetup: boolean - - /** - * Retrieve an application setting by name - * - * @param name The setting name - */ - get(name: L): Settings[L] - - /** - * Set an application setting - * - * @param name The setting name - * @param value The setting value - */ - set(name: L, value: Settings[L]): this - - /** - * Runs a callback configure function with the current application instance. - * - * @param callback The callback `(app: Application) => {}` to run - */ - configure(callback: (this: this, app: this) => void): this - - /** - * Returns a fallback service instance that will be registered - * when no service was found. Usually throws a `NotFound` error - * but also used to instantiate client side services. - * - * @param location The path of the service - */ - defaultService(location: string): ServiceInterface - - /** - * Register a new service or a sub-app. When passed another - * Feathers application, all its services will be re-registered - * with the `path` prefix. - * - * @param path The path for the service to register - * @param service The service object to register or another - * Feathers application to use a sub-app under the `path` prefix. - * @param options The options for this service - */ - use( - path: L, - service: keyof any extends keyof Services ? ServiceInterface | Application : Services[L], - options?: ServiceOptions - ): this - - /** - * Unregister an existing service. - * - * @param path The name of the service to unregister - */ - unuse( - path: L - ): Promise> - - /** - * Get the Feathers service instance for a path. This will - * be the service originally registered with Feathers functionality - * like hooks and events added. - * - * @param path The name of the service. - */ - service( - path: L - ): FeathersService - - /** - * Set up the application and call all services `.setup` method if available. - * - * @param server A server instance (optional) - */ - setup(server?: any): Promise - - /** - * Tear down the application and call all services `.teardown` method if available. - * - * @param server A server instance (optional) - */ - teardown(server?: any): Promise - - /** - * Register application level hooks. - * - * @param map The application hook settings. - */ - hooks(map: ApplicationHookOptions): this -} - -// This needs to be an interface instead of a type -// so that the declaration can be extended by other modules -export interface Application - extends FeathersApplication, - EventEmitter {} - -export type Id = number | string -export type NullableId = Id | null - -export interface Query { - [key: string]: any -} - -export interface Params { - query?: Q - provider?: string - route?: { [key: string]: any } - headers?: { [key: string]: any } -} - -export interface PaginationOptions { - default?: number - max?: number -} - -export type PaginationParams = false | PaginationOptions - -export interface Http { - /** - * A writeable, optional property with status code override. - */ - status?: number - /** - * A writeable, optional property with headers. - */ - headers?: { [key: string]: string | string[] } - /** - * A writeable, optional property with `Location` header's value. - */ - location?: string -} - -export type HookType = 'before' | 'after' | 'error' | 'around' - -type Serv = FA extends Application ? S : never - -export interface HookContext extends BaseHookContext> { - /** - * A read only property that contains the Feathers application object. This can be used to - * retrieve other services (via context.app.service('name')) or configuration values. - */ - readonly app: A - /** - * A read only property with the name of the service method (one of find, get, - * create, update, patch, remove). - */ - readonly method: string - /** - * A read only property and contains the service name (or path) without leading or - * trailing slashes. - */ - path: 0 extends 1 & S ? keyof Serv & string : GetKeyByValue, S> & string - /** - * A read only property and contains the service this hook currently runs on. - */ - readonly service: S - /** - * A read only property with the hook type (one of 'around', 'before', 'after' or 'error'). - */ - readonly type: HookType - /** - * The list of method arguments. Should not be modified, modify the - * `params`, `data` and `id` properties instead. - */ - readonly arguments: any[] - /** - * A writeable property containing the data of a create, update and patch service - * method call. - */ - data?: ServiceGenericData - /** - * A writeable property with the error object that was thrown in a failed method call. - * It is only available in error hooks. - */ - error?: any - /** - * A writeable property and the id for a get, remove, update and patch service - * method call. For remove, update and patch context.id can also be null when - * modifying multiple entries. In all other cases it will be undefined. - */ - id?: Id - /** - * A writeable property that contains the service method parameters (including - * params.query). - */ - params: ServiceGenericParams - /** - * A writeable property containing the result of the successful service method call. - * It is only available in after hooks. - * - * `context.result` can also be set in - * - * - A before hook to skip the actual service method (database) call - * - An error hook to swallow the error and return a result instead - */ - result?: ServiceGenericType - /** - * A writeable, optional property and contains a 'safe' version of the data that - * should be sent to any client. If context.dispatch has not been set context.result - * will be sent to the client instead. - */ - dispatch?: ServiceGenericType - /** - * A writeable, optional property that allows to override the standard HTTP status - * code that should be returned. - * - * @deprecated Use `http.status` instead. - */ - statusCode?: number - /** - * A writeable, optional property with options specific to HTTP transports. - */ - http?: Http - /** - * The event emitted by this method. Can be set to `null` to skip event emitting. - */ - event: string | null -} - -// Regular hook typings -export type HookFunction = ( - this: S, - context: HookContext -) => Promise | void> | HookContext | void - -export type Hook = HookFunction - -type HookMethodMap = { - [L in keyof S]?: SelfOrArray> -} & { all?: SelfOrArray> } - -type HookTypeMap = SelfOrArray> | HookMethodMap - -// New @feathersjs/hook typings -export type AroundHookFunction = ( - context: HookContext, - next: NextFunction -) => Promise - -export type AroundHookMap = { - [L in keyof S]?: AroundHookFunction[] -} & { all?: AroundHookFunction[] } - -export type HookMap = { - around?: AroundHookMap - before?: HookTypeMap - after?: HookTypeMap - error?: HookTypeMap -} - -export type HookOptions = AroundHookMap | AroundHookFunction[] | HookMap - -export interface ApplicationHookContext extends BaseHookContext { - app: A - server: any -} - -export type ApplicationHookFunction = ( - context: ApplicationHookContext, - next: NextFunction -) => Promise - -export type ApplicationHookMap = { - setup?: ApplicationHookFunction[] - teardown?: ApplicationHookFunction[] -} - -export type ApplicationHookOptions = HookOptions | ApplicationHookMap diff --git a/packages/feathers/src/events.ts b/packages/feathers/src/events.ts deleted file mode 100644 index 50956f829..000000000 --- a/packages/feathers/src/events.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { EventEmitter } from 'events' -import { NextFunction } from '@feathersjs/hooks' -import { HookContext, FeathersService } from './declarations' -import { getServiceOptions, defaultEventMap } from './service' - -export function eventHook(context: HookContext, next: NextFunction) { - const { events } = getServiceOptions((context as any).self) - const defaultEvent = (defaultEventMap as any)[context.method] || null - - context.event = defaultEvent - - return next().then(() => { - // Send the event only if the service does not do so already (indicated in the `events` option) - // This is used for custom events and for client services receiving event from the server - if (typeof context.event === 'string' && !events.includes(context.event)) { - const results = Array.isArray(context.result) ? context.result : [context.result] - - results.forEach((element) => (context as any).self.emit(context.event, element, context)) - } - }) -} - -export function eventMixin(service: FeathersService) { - const isEmitter = typeof service.on === 'function' && typeof service.emit === 'function' - - if (!isEmitter) { - Object.assign(service, EventEmitter.prototype) - } - - return service -} diff --git a/packages/feathers/src/hooks.ts b/packages/feathers/src/hooks.ts deleted file mode 100644 index 758ab3325..000000000 --- a/packages/feathers/src/hooks.ts +++ /dev/null @@ -1,237 +0,0 @@ -import { - getManager, - HookContextData, - HookManager, - HookMap as BaseHookMap, - hooks, - Middleware, - collect -} from '@feathersjs/hooks' -import { - Service, - ServiceOptions, - HookContext, - FeathersService, - HookMap, - AroundHookFunction, - HookFunction, - HookType -} from './declarations' -import { defaultServiceArguments, getHookMethods } from './service' - -type ConvertedMap = { [type in HookType]: ReturnType } - -type HookStore = { - around: { [method: string]: AroundHookFunction[] } - before: { [method: string]: HookFunction[] } - after: { [method: string]: HookFunction[] } - error: { [method: string]: HookFunction[] } - collected: { [method: string]: AroundHookFunction[] } - collectedAll: { before?: AroundHookFunction[]; after?: AroundHookFunction[] } -} - -type HookEnabled = { __hooks: HookStore } - -const types: HookType[] = ['before', 'after', 'error', 'around'] - -const isType = (value: any): value is HookType => types.includes(value) - -// Converts different hook registration formats into the -// same internal format -export function convertHookData(input: any) { - const result: { [method: string]: HookFunction[] | AroundHookFunction[] } = {} - - if (Array.isArray(input)) { - result.all = input - } else if (typeof input !== 'object') { - result.all = [input] - } else { - for (const key of Object.keys(input)) { - const value = input[key] - result[key] = Array.isArray(value) ? value : [value] - } - } - - return result -} - -export function collectHooks(target: HookEnabled, method: string) { - const { collected, collectedAll, around } = target.__hooks - - return [ - ...(around.all || []), - ...(around[method] || []), - ...(collectedAll.before || []), - ...(collected[method] || []), - ...(collectedAll.after || []) - ] as AroundHookFunction[] -} - -// Add `.hooks` functionality to an object -export function enableHooks(object: any) { - const store: HookStore = { - around: {}, - before: {}, - after: {}, - error: {}, - collected: {}, - collectedAll: {} - } - - Object.defineProperty(object, '__hooks', { - configurable: true, - value: store, - writable: true - }) - - return function registerHooks(this: HookEnabled, input: HookMap) { - const store = this.__hooks - const map = Object.keys(input).reduce((map, type) => { - if (!isType(type)) { - throw new Error(`'${type}' is not a valid hook type`) - } - - map[type] = convertHookData(input[type]) - - return map - }, {} as ConvertedMap) - const types = Object.keys(map) as HookType[] - - types.forEach((type) => - Object.keys(map[type]).forEach((method) => { - const mapHooks = map[type][method] - const storeHooks: any[] = (store[type][method] ||= []) - - storeHooks.push(...mapHooks) - - if (method === 'all') { - if (store.before[method] || store.error[method]) { - const beforeAll = collect({ - before: store.before[method] || [], - error: store.error[method] || [] - }) - store.collectedAll.before = [beforeAll] - } - - if (store.after[method]) { - const afterAll = collect({ - after: store.after[method] || [] - }) - store.collectedAll.after = [afterAll] - } - } else { - if (store.before[method] || store.after[method] || store.error[method]) { - const collected = collect({ - before: store.before[method] || [], - after: store.after[method] || [], - error: store.error[method] || [] - }) - - store.collected[method] = [collected] - } - } - }) - ) - - return this - } -} - -export function createContext(service: Service, method: string, data: HookContextData = {}) { - const createContext = (service as any)[method].createContext - - if (typeof createContext !== 'function') { - throw new Error(`Can not create context for method ${method}`) - } - - return createContext(data) as HookContext -} - -export class FeathersHookManager extends HookManager { - constructor( - public app: A, - public method: string - ) { - super() - this._middleware = [] - } - - collectMiddleware(self: any, args: any[]): Middleware[] { - const appHooks = collectHooks(this.app as any as HookEnabled, this.method) - const middleware = super.collectMiddleware(self, args) - const methodHooks = collectHooks(self, this.method) - - return [...appHooks, ...middleware, ...methodHooks] - } - - initializeContext(self: any, args: any[], context: HookContext) { - const ctx = super.initializeContext(self, args, context) - - ctx.params = ctx.params || {} - - return ctx - } - - middleware(mw: Middleware[]) { - this._middleware.push(...mw) - return this - } -} - -export function hookMixin(this: A, service: FeathersService, path: string, options: ServiceOptions) { - if (typeof service.hooks === 'function') { - return service - } - - const hookMethods = getHookMethods(service, options) - - const serviceMethodHooks = hookMethods.reduce((res, method) => { - const params = (defaultServiceArguments as any)[method] || ['data', 'params'] - - res[method] = new FeathersHookManager(this, method).params(...params).props({ - app: this, - path, - method, - service, - event: null, - type: 'around', - get statusCode() { - return this.http?.status - }, - set statusCode(value: number) { - this.http = this.http || {} - this.http.status = value - } - }) - - return res - }, {} as BaseHookMap) - - const registerHooks = enableHooks(service) - - hooks(service, serviceMethodHooks) - - service.hooks = function (this: any, hookOptions: any) { - if (hookOptions.before || hookOptions.after || hookOptions.error || hookOptions.around) { - return registerHooks.call(this, hookOptions) - } - - if (Array.isArray(hookOptions)) { - return hooks(this, hookOptions) - } - - Object.keys(hookOptions).forEach((method) => { - const manager = getManager(this[method]) - - if (!(manager instanceof FeathersHookManager)) { - throw new Error(`Method ${method} is not a Feathers hooks enabled service method`) - } - - manager.middleware(hookOptions[method]) - }) - - return this - } - - return service -} diff --git a/packages/feathers/src/index.ts b/packages/feathers/src/index.ts index c37bfef95..c4db71032 100644 --- a/packages/feathers/src/index.ts +++ b/packages/feathers/src/index.ts @@ -1,20 +1 @@ -import { setDebug } from '@feathersjs/commons' - -import version from './version' -import { Feathers } from './application' -import { Application } from './declarations' - -export function feathers() { - return new Feathers() as Application -} - -feathers.setDebug = setDebug - -export { version, Feathers } -export * from './hooks' -export * from './declarations' -export * from './service' - -if (typeof module !== 'undefined') { - module.exports = Object.assign(feathers, module.exports) -} +export * from 'feathers' diff --git a/packages/feathers/src/service.ts b/packages/feathers/src/service.ts deleted file mode 100644 index eb852f39b..000000000 --- a/packages/feathers/src/service.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { EventEmitter } from 'events' -import { createSymbol } from '@feathersjs/commons' -import { ServiceOptions } from './declarations' - -export const SERVICE = createSymbol('@feathersjs/service') - -export const defaultServiceArguments = { - find: ['params'], - get: ['id', 'params'], - create: ['data', 'params'], - update: ['id', 'data', 'params'], - patch: ['id', 'data', 'params'], - remove: ['id', 'params'] -} -export const defaultServiceMethods = ['find', 'get', 'create', 'update', 'patch', 'remove'] - -export const defaultEventMap = { - create: 'created', - update: 'updated', - patch: 'patched', - remove: 'removed' -} - -export const defaultServiceEvents = Object.values(defaultEventMap) - -export const protectedMethods = Object.keys(Object.prototype) - .concat(Object.keys(EventEmitter.prototype)) - .concat(['all', 'around', 'before', 'after', 'error', 'hooks', 'setup', 'teardown', 'publish']) - -export function getHookMethods(service: any, options: ServiceOptions) { - const { methods } = options - - return (defaultServiceMethods as any as string[]) - .filter((m) => typeof service[m] === 'function' && !methods.includes(m)) - .concat(methods) -} - -export function getServiceOptions(service: any): ServiceOptions { - return service[SERVICE] -} - -export const normalizeServiceOptions = (service: any, options: ServiceOptions = {}): ServiceOptions => { - const { - methods = defaultServiceMethods.filter((method) => typeof service[method] === 'function'), - events = service.events || [] - } = options - const serviceEvents = options.serviceEvents || defaultServiceEvents.concat(events) - - return { - ...options, - events, - methods, - serviceEvents - } -} - -export function wrapService(location: string, service: any, options: ServiceOptions) { - // Do nothing if this is already an initialized - if (service[SERVICE]) { - return service - } - - const protoService = Object.create(service) - const serviceOptions = normalizeServiceOptions(service, options) - - if ( - Object.keys(serviceOptions.methods).length === 0 && - ![...defaultServiceMethods, 'setup', 'teardown'].some((method) => typeof service[method] === 'function') - ) { - throw new Error(`Invalid service object passed for path \`${location}\``) - } - - Object.defineProperty(protoService, SERVICE, { - value: serviceOptions - }) - - return protoService -} diff --git a/packages/feathers/src/version.ts b/packages/feathers/src/version.ts deleted file mode 100644 index e47b8144b..000000000 --- a/packages/feathers/src/version.ts +++ /dev/null @@ -1 +0,0 @@ -export default 'development' diff --git a/packages/feathers/test/application.test.ts b/packages/feathers/test/application.test.ts index ea5a93774..a97b0f51b 100644 --- a/packages/feathers/test/application.test.ts +++ b/packages/feathers/test/application.test.ts @@ -1,7 +1,7 @@ /* eslint-disable @typescript-eslint/ban-ts-comment, @typescript-eslint/no-empty-function */ import assert from 'assert' -import { feathers, Feathers, getServiceOptions, Id, version } from '../src' - +import type { Id } from '../src/index.js' +import { feathers, Feathers, getServiceOptions, version } from '../src/index.js' describe('Feathers application', () => { it('initializes', () => { const app = feathers() diff --git a/packages/feathers/test/declarations.test.ts b/packages/feathers/test/declarations.test.ts index 1ee2389dc..1d7818e02 100644 --- a/packages/feathers/test/declarations.test.ts +++ b/packages/feathers/test/declarations.test.ts @@ -1,7 +1,7 @@ import assert from 'assert' import { hooks } from '@feathersjs/hooks' -import { feathers, ServiceInterface, Application, HookContext, NextFunction } from '../src' - +import type { ServiceInterface, Application, HookContext, NextFunction } from '../src/index.js' +import { feathers } from '../src/index.js' interface Todo { id: number message: string diff --git a/packages/feathers/test/events.test.ts b/packages/feathers/test/events.test.ts index 58e6b7f24..5682c9832 100644 --- a/packages/feathers/test/events.test.ts +++ b/packages/feathers/test/events.test.ts @@ -1,7 +1,7 @@ import assert from 'assert' import { EventEmitter } from 'events' -import { feathers } from '../src' +import { feathers } from '../src/index.js' describe('Service events', () => { it('app is an event emitter', (done) => { diff --git a/packages/feathers/test/hooks/after.test.ts b/packages/feathers/test/hooks/after.test.ts index d4440472f..078803cee 100644 --- a/packages/feathers/test/hooks/after.test.ts +++ b/packages/feathers/test/hooks/after.test.ts @@ -1,6 +1,6 @@ import assert from 'assert' -import { feathers, Id } from '../../src' - +import type { Id } from '../../src/index.js' +import { feathers } from '../../src/index.js' describe('`after` hooks', () => { it('.after hooks can return a promise', async () => { const app = feathers().use('/dummy', { diff --git a/packages/feathers/test/hooks/app.test.ts b/packages/feathers/test/hooks/app.test.ts index a7c2df4e4..733a32e4f 100644 --- a/packages/feathers/test/hooks/app.test.ts +++ b/packages/feathers/test/hooks/app.test.ts @@ -1,7 +1,8 @@ import assert from 'assert' -import { feathers, Application, ApplicationHookMap, ServiceInterface, Params } from '../../src' +import type { Application, ApplicationHookMap, ServiceInterface, Params } from '../../src/index.js' +import { feathers } from '../../src/index.js' type Todo = { id?: string params?: TodoParams diff --git a/packages/feathers/test/hooks/around.test.ts b/packages/feathers/test/hooks/around.test.ts index d9277ae6d..f2f129c64 100644 --- a/packages/feathers/test/hooks/around.test.ts +++ b/packages/feathers/test/hooks/around.test.ts @@ -1,6 +1,6 @@ import assert from 'assert' -import { feathers, Params, ServiceInterface } from '../../src' - +import type { Params, ServiceInterface } from '../../src/index.js' +import { feathers } from '../../src/index.js' describe('`around` hooks', () => { it('around hooks can set hook.result which will skip service method', async () => { const app = feathers().use('/dummy', { diff --git a/packages/feathers/test/hooks/before.test.ts b/packages/feathers/test/hooks/before.test.ts index a76e32954..4910438ff 100644 --- a/packages/feathers/test/hooks/before.test.ts +++ b/packages/feathers/test/hooks/before.test.ts @@ -1,6 +1,6 @@ import assert from 'assert' -import { feathers, Params, ServiceInterface } from '../../src' - +import type { Params, ServiceInterface } from '../../src/index.js' +import { feathers } from '../../src/index.js' describe('`before` hooks', () => { it('.before hooks can return a promise', async () => { interface DummyParams extends Params { diff --git a/packages/feathers/test/hooks/error.test.ts b/packages/feathers/test/hooks/error.test.ts index 4c42d266c..cf92fe6e9 100644 --- a/packages/feathers/test/hooks/error.test.ts +++ b/packages/feathers/test/hooks/error.test.ts @@ -1,6 +1,6 @@ import assert from 'assert' -import { feathers, Application, FeathersService } from '../../src' - +import type { Application, FeathersService } from '../../src/index.js' +import { feathers } from '../../src/index.js' describe('`error` hooks', () => { describe('on direct service method errors', () => { const errorMessage = 'Something else went wrong' diff --git a/packages/feathers/test/hooks/hooks.test.ts b/packages/feathers/test/hooks/hooks.test.ts index 8afd74330..521dcc8d5 100644 --- a/packages/feathers/test/hooks/hooks.test.ts +++ b/packages/feathers/test/hooks/hooks.test.ts @@ -1,7 +1,8 @@ import assert from 'assert' -import { hooks, NextFunction } from '@feathersjs/hooks' -import { HookContext, createContext, feathers, Id, Params, ServiceInterface } from '../../src' - +import type { NextFunction } from 'feathers/hooks' +import { hooks } from 'feathers/hooks' +import type { HookContext, Id, Params, ServiceInterface } from '../../src/index.js' +import { createContext, feathers } from '../../src/index.js' describe('hooks basics', () => { it('mix @feathersjs/hooks and .hooks', async () => { interface SimpleParams extends Params { diff --git a/packages/generators/README.md b/packages/generators/README.md index eca4bc0a6..0ada3d47a 100644 --- a/packages/generators/README.md +++ b/packages/generators/README.md @@ -17,6 +17,6 @@ Refer to the [Feathers CLI guide](https://feathersjs.com/guides/cli/) for more d ## License -Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) +Copyright (c) 2025 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) Licensed under the [MIT license](LICENSE). diff --git a/packages/generators/package.json b/packages/generators/package.json index 55f9ca825..0a57085b5 100644 --- a/packages/generators/package.json +++ b/packages/generators/package.json @@ -27,10 +27,9 @@ "url": "https://github.com/feathersjs/feathers/issues" }, "engines": { - "node": ">= 16" + "node": ">= 20" }, "main": "lib/index.js", - "types": "lib/", "type": "module", "files": [ "CHANGELOG.md", @@ -54,7 +53,7 @@ "dependencies": { "@featherscloud/pinion": "^0.5.5", "chalk": "^5.6.2", - "lodash": "^4.17.21", + "lodash-es": "^4.17.21", "prettier": "^3.6.2", "typescript": "^5.9.2" }, @@ -66,6 +65,7 @@ "@feathersjs/authentication-oauth": "^5.0.35", "@feathersjs/configuration": "^5.0.35", "@feathersjs/errors": "^5.0.35", + "@feathersjs/hooks": "^5.0.35", "@feathersjs/express": "^5.0.35", "@feathersjs/feathers": "^5.0.35", "@feathersjs/knex": "^5.0.35", @@ -79,6 +79,7 @@ "@types/mocha": "^10.0.10", "@types/node": "^24.3.1", "@types/prettier": "^2.7.3", + "typebox": "^1.0.0", "axios": "^1.11.0", "knex": "^3.1.0", "mocha": "^11.7.2", diff --git a/packages/generators/src/app/index.ts b/packages/generators/src/app/index.ts index c004f8e3f..6ceb9e3b2 100644 --- a/packages/generators/src/app/index.ts +++ b/packages/generators/src/app/index.ts @@ -157,6 +157,7 @@ export const generate = (ctx: AppGeneratorArguments) => dependencies.push( '@feathersjs/feathers', + '@feathersjs/hooks', '@feathersjs/errors', '@feathersjs/schema', '@feathersjs/configuration', @@ -181,6 +182,7 @@ export const generate = (ctx: AppGeneratorArguments) => if (schema === 'typebox') { dependencies.push('@feathersjs/typebox') + dependencies.push('typebox') } return addVersions(dependencies, dependencyVersions) diff --git a/packages/generators/src/app/templates/configuration.tpl.ts b/packages/generators/src/app/templates/configuration.tpl.ts index 85eed1dd4..845fe8594 100644 --- a/packages/generators/src/app/templates/configuration.tpl.ts +++ b/packages/generators/src/app/templates/configuration.tpl.ts @@ -58,14 +58,14 @@ import type { Static } from '@feathersjs/typebox' import { dataValidator } from './validators' -export const configurationSchema = Type.Intersect([ +export const configurationSchema = Type.Evaluate(Type.Intersect([ defaultAppConfiguration, Type.Object({ host: Type.String(), port: Type.Number(), public: Type.String() }) -]) +])) export type ApplicationConfiguration = Static diff --git a/packages/generators/src/app/templates/declarations.tpl.ts b/packages/generators/src/app/templates/declarations.tpl.ts index 5224842e5..805fdb2a4 100644 --- a/packages/generators/src/app/templates/declarations.tpl.ts +++ b/packages/generators/src/app/templates/declarations.tpl.ts @@ -5,8 +5,8 @@ const template = ({ framework, schema }: AppGeneratorContext) => /* ts */ `// For more information about this file see https://dove.feathersjs.com/guides/cli/typescript.html -import { HookContext as FeathersHookContext, NextFunction } from '@feathersjs/feathers' -import { Application as FeathersApplication } from '@feathersjs/${framework}' +import type { HookContext as FeathersHookContext, NextFunction } from '@feathersjs/feathers' +import type { Application as FeathersApplication } from '@feathersjs/${framework}' ${ schema === false ? `type ApplicationConfiguration = any` diff --git a/packages/generators/src/app/templates/tsconfig.json.tpl.ts b/packages/generators/src/app/templates/tsconfig.json.tpl.ts index 72cf2af85..984839a4c 100644 --- a/packages/generators/src/app/templates/tsconfig.json.tpl.ts +++ b/packages/generators/src/app/templates/tsconfig.json.tpl.ts @@ -12,7 +12,7 @@ export const generate = (ctx: AppGeneratorContext) => }, compilerOptions: { target: 'es2020', - module: 'commonjs', + module: 'CommonJS', outDir: './lib', rootDir: `./${lib}`, declaration: true, diff --git a/packages/generators/src/hook/index.ts b/packages/generators/src/hook/index.ts index fb4976b5e..364314452 100644 --- a/packages/generators/src/hook/index.ts +++ b/packages/generators/src/hook/index.ts @@ -1,7 +1,7 @@ import { dirname } from 'path' import { fileURLToPath } from 'url' import { prompt, runGenerators } from '@featherscloud/pinion' -import _ from 'lodash' +import { kebabCase, camelCase } from 'lodash-es' import { checkPreconditions, FeathersBaseContext, initializeBaseContext } from '../commons.js' // Set __dirname in es module @@ -40,8 +40,8 @@ export const generate = (ctx: HookGeneratorContext) => ) .then((ctx) => { const { name } = ctx - const kebabName = _.kebabCase(name) - const camelName = _.camelCase(name) + const kebabName = kebabCase(name) + const camelName = camelCase(name) return { ...ctx, diff --git a/packages/generators/src/service/index.ts b/packages/generators/src/service/index.ts index f3268fde5..8abd90fbb 100644 --- a/packages/generators/src/service/index.ts +++ b/packages/generators/src/service/index.ts @@ -1,5 +1,5 @@ import { dirname } from 'path' -import _ from 'lodash' +import { camelCase, kebabCase, upperFirst, last } from 'lodash-es' import { runGenerator, runGenerators, prompt } from '@featherscloud/pinion' import { fileURLToPath } from 'url' import chalk from 'chalk' @@ -117,7 +117,7 @@ export const generate = (ctx: ServiceGeneratorArguments) => type: 'input', when: !path, message: 'Which path should the service be registered on?', - default: (answers: ServiceGeneratorArguments) => `${_.kebabCase(answers.name)}`, + default: (answers: ServiceGeneratorArguments) => `${kebabCase(answers.name)}`, validate: (input: any) => { if (!input || input === 'authentication') { return 'Invalid service path' @@ -184,15 +184,15 @@ export const generate = (ctx: ServiceGeneratorArguments) => ) .then(async (ctx): Promise => { const { name, path, type, authStrategies = [] } = ctx as any as ServiceGeneratorContext - const kebabName = _.kebabCase(name) - const camelName = _.camelCase(name) - const upperName = _.upperFirst(camelName) + const kebabName = kebabCase(name) + const camelName = camelCase(name) + const upperName = upperFirst(camelName) const className = `${upperName}Service` const folder = path.split('/').filter((el) => el !== '') const relative = ['', ...folder].map(() => '..').join('/') - const fileName = _.last(folder) - const kebabPath = _.kebabCase(path) + const fileName = last(folder) + const kebabPath = kebabCase(path) return { name, diff --git a/packages/generators/src/service/templates/schema.typebox.tpl.ts b/packages/generators/src/service/templates/schema.typebox.tpl.ts index 3f7203f5c..88c239f9a 100644 --- a/packages/generators/src/service/templates/schema.typebox.tpl.ts +++ b/packages/generators/src/service/templates/schema.typebox.tpl.ts @@ -53,7 +53,7 @@ export const ${camelName}ExternalResolver = resolve<${upperName}, HookContext<${ authStrategies, `// The password should never be visible externally password: async () => undefined` - )} + )} }) // Schema for creating new entries @@ -90,11 +90,11 @@ export const ${camelName}QueryProperties = Type.Pick(${camelName}Schema, [ : `'text'` } ]) -export const ${camelName}QuerySchema = Type.Intersect([ - querySyntax(${camelName}QueryProperties), +export const ${camelName}QuerySchema = Type.Evaluate(Type.Intersect([ + querySyntax(${camelName}QueryProperties, {}), // Add additional query properties here Type.Object({}, { additionalProperties: false }) -], { additionalProperties: false }) +], { additionalProperties: false })) export type ${upperName}Query = Static export const ${camelName}QueryValidator = getValidator(${camelName}QuerySchema, queryValidator) export const ${camelName}QueryResolver = resolve<${upperName}Query, HookContext<${upperName}Service>>({ diff --git a/packages/generators/test/generators.test.ts b/packages/generators/test/generators.test.ts index 40aa06c8d..b3b3d8c87 100644 --- a/packages/generators/test/generators.test.ts +++ b/packages/generators/test/generators.test.ts @@ -9,7 +9,7 @@ import { AppGeneratorContext } from '../src/app' import { FeathersBaseContext } from '../src/commons' import { ConnectionGeneratorArguments } from '../src/connection' import { ServiceGeneratorArguments } from '../src/service' -import { combinate, dependencyVersions } from './utils' +import { combinate, dependencyVersions } from './utils.js' import { generate as generateApp } from '../lib/app' import { generate as generateConnection } from '../lib/connection' diff --git a/packages/hooks/CHANGELOG.md b/packages/hooks/CHANGELOG.md new file mode 100644 index 000000000..fcac0bf01 --- /dev/null +++ b/packages/hooks/CHANGELOG.md @@ -0,0 +1,1021 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [5.0.34](https://github.com/feathersjs/feathers/compare/v5.0.33...v5.0.34) (2025-05-03) + +### Bug Fixes + +- Update dependencies ([#3584](https://github.com/feathersjs/feathers/issues/3584)) ([119fa4e](https://github.com/feathersjs/feathers/commit/119fa4e1ade8b0078aa235083d566e2538b3a084)) + +## [5.0.33](https://github.com/feathersjs/feathers/compare/v5.0.32...v5.0.33) (2025-02-24) + +### Bug Fixes + +- **dependencies:** Update dependencies ([#3571](https://github.com/feathersjs/feathers/issues/3571)) ([ad611cb](https://github.com/feathersjs/feathers/commit/ad611cb6ffb1dc31d603ba5817331318c5a23217)) + +## [5.0.32](https://github.com/feathersjs/feathers/compare/v5.0.31...v5.0.32) (2025-02-01) + +**Note:** Version bump only for package @feathersjs/errors + +## [5.0.31](https://github.com/feathersjs/feathers/compare/v5.0.30...v5.0.31) (2024-10-31) + +### Bug Fixes + +- **dependencies:** Update all dependencies ([#3545](https://github.com/feathersjs/feathers/issues/3545)) ([221b92b](https://github.com/feathersjs/feathers/commit/221b92bb0ee5d54fb1036742968797cb02e56da2)) + +## [5.0.30](https://github.com/feathersjs/feathers/compare/v5.0.29...v5.0.30) (2024-09-02) + +**Note:** Version bump only for package @feathersjs/errors + +## [5.0.29](https://github.com/feathersjs/feathers/compare/v5.0.28...v5.0.29) (2024-07-10) + +**Note:** Version bump only for package @feathersjs/errors + +## [5.0.28](https://github.com/feathersjs/feathers/compare/v5.0.27...v5.0.28) (2024-07-10) + +**Note:** Version bump only for package @feathersjs/errors + +## [5.0.27](https://github.com/feathersjs/feathers/compare/v5.0.26...v5.0.27) (2024-06-18) + +**Note:** Version bump only for package @feathersjs/errors + +## [5.0.26](https://github.com/feathersjs/feathers/compare/v5.0.25...v5.0.26) (2024-06-09) + +**Note:** Version bump only for package @feathersjs/errors + +## [5.0.25](https://github.com/feathersjs/feathers/compare/v5.0.24...v5.0.25) (2024-05-03) + +**Note:** Version bump only for package @feathersjs/errors + +## [5.0.24](https://github.com/feathersjs/feathers/compare/v5.0.23...v5.0.24) (2024-03-13) + +**Note:** Version bump only for package @feathersjs/errors + +## [5.0.23](https://github.com/feathersjs/feathers/compare/v5.0.22...v5.0.23) (2024-02-25) + +### Bug Fixes + +- **core:** Update to latest feathersjs/hooks ([#3434](https://github.com/feathersjs/feathers/issues/3434)) ([1499ccc](https://github.com/feathersjs/feathers/commit/1499ccc41fb3ebba97b2c84e0cb19bc48ad3c651)) + +## [5.0.22](https://github.com/feathersjs/feathers/compare/v5.0.21...v5.0.22) (2024-02-15) + +**Note:** Version bump only for package @feathersjs/errors + +## [5.0.21](https://github.com/feathersjs/feathers/compare/v5.0.20...v5.0.21) (2024-01-25) + +**Note:** Version bump only for package @feathersjs/errors + +## [5.0.20](https://github.com/feathersjs/feathers/compare/v5.0.19...v5.0.20) (2024-01-24) + +**Note:** Version bump only for package @feathersjs/errors + +## [5.0.19](https://github.com/feathersjs/feathers/compare/v5.0.18...v5.0.19) (2024-01-23) + +**Note:** Version bump only for package @feathersjs/errors + +## [5.0.18](https://github.com/feathersjs/feathers/compare/v5.0.17...v5.0.18) (2024-01-22) + +**Note:** Version bump only for package @feathersjs/errors + +## [5.0.17](https://github.com/feathersjs/feathers/compare/v5.0.16...v5.0.17) (2024-01-22) + +**Note:** Version bump only for package @feathersjs/errors + +## [5.0.16](https://github.com/feathersjs/feathers/compare/v5.0.15...v5.0.16) (2024-01-22) + +**Note:** Version bump only for package @feathersjs/errors + +## [5.0.15](https://github.com/feathersjs/feathers/compare/v5.0.14...v5.0.15) (2024-01-22) + +**Note:** Version bump only for package @feathersjs/errors + +## [5.0.14](https://github.com/feathersjs/feathers/compare/v5.0.13...v5.0.14) (2024-01-05) + +**Note:** Version bump only for package @feathersjs/errors + +## [5.0.13](https://github.com/feathersjs/feathers/compare/v5.0.12...v5.0.13) (2023-12-29) + +**Note:** Version bump only for package @feathersjs/errors + +## [5.0.12](https://github.com/feathersjs/feathers/compare/v5.0.11...v5.0.12) (2023-11-28) + +**Note:** Version bump only for package @feathersjs/errors + +## [5.0.11](https://github.com/feathersjs/feathers/compare/v5.0.10...v5.0.11) (2023-10-11) + +### Bug Fixes + +- **knex:** Update all dependencies and Knex peer ([#3308](https://github.com/feathersjs/feathers/issues/3308)) ([d2f9860](https://github.com/feathersjs/feathers/commit/d2f986036c4741cce2339d8abbcc6b2eb037a12a)) + +## [5.0.10](https://github.com/feathersjs/feathers/compare/v5.0.9...v5.0.10) (2023-10-03) + +**Note:** Version bump only for package @feathersjs/errors + +## [5.0.9](https://github.com/feathersjs/feathers/compare/v5.0.8...v5.0.9) (2023-09-27) + +**Note:** Version bump only for package @feathersjs/errors + +## [5.0.8](https://github.com/feathersjs/feathers/compare/v5.0.7...v5.0.8) (2023-07-19) + +**Note:** Version bump only for package @feathersjs/errors + +## [5.0.7](https://github.com/feathersjs/feathers/compare/v5.0.6...v5.0.7) (2023-07-14) + +**Note:** Version bump only for package @feathersjs/errors + +## [5.0.6](https://github.com/feathersjs/feathers/compare/v5.0.5...v5.0.6) (2023-06-15) + +**Note:** Version bump only for package @feathersjs/errors + +## [5.0.5](https://github.com/feathersjs/feathers/compare/v5.0.4...v5.0.5) (2023-04-28) + +**Note:** Version bump only for package @feathersjs/errors + +## [5.0.4](https://github.com/feathersjs/feathers/compare/v5.0.3...v5.0.4) (2023-04-12) + +### Bug Fixes + +- Make sure all Readme files are up to date ([#3154](https://github.com/feathersjs/feathers/issues/3154)) ([a5f0b38](https://github.com/feathersjs/feathers/commit/a5f0b38bbf2a11486415a39533bcc6c67fb51e3e)) + +## [5.0.3](https://github.com/feathersjs/feathers/compare/v5.0.2...v5.0.3) (2023-04-05) + +### Bug Fixes + +- **dependencies:** Update all dependencies ([#3139](https://github.com/feathersjs/feathers/issues/3139)) ([f24276e](https://github.com/feathersjs/feathers/commit/f24276e9a909e2e58a0730c730258ce1f70f4028)) + +## [5.0.1](https://github.com/feathersjs/feathers/compare/v5.0.0...v5.0.1) (2023-03-15) + +**Note:** Version bump only for package @feathersjs/errors + +# [5.0.0](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.38...v5.0.0) (2023-02-24) + +**Note:** Version bump only for package @feathersjs/errors + +# [5.0.0-pre.38](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.37...v5.0.0-pre.38) (2023-02-17) + +**Note:** Version bump only for package @feathersjs/errors + +# [5.0.0-pre.37](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.36...v5.0.0-pre.37) (2023-02-09) + +**Note:** Version bump only for package @feathersjs/errors + +# [5.0.0-pre.36](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.35...v5.0.0-pre.36) (2023-01-29) + +**Note:** Version bump only for package @feathersjs/errors + +# [5.0.0-pre.35](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.34...v5.0.0-pre.35) (2023-01-12) + +### Features + +- **generators:** Move core code generators to shared generators package ([#2982](https://github.com/feathersjs/feathers/issues/2982)) ([0328d22](https://github.com/feathersjs/feathers/commit/0328d2292153870bc43958f73d2c6f288a8cec17)) + +# [5.0.0-pre.34](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.33...v5.0.0-pre.34) (2022-12-14) + +**Note:** Version bump only for package @feathersjs/errors + +# [5.0.0-pre.33](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.32...v5.0.0-pre.33) (2022-11-08) + +**Note:** Version bump only for package @feathersjs/errors + +# [5.0.0-pre.32](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.31...v5.0.0-pre.32) (2022-10-26) + +**Note:** Version bump only for package @feathersjs/errors + +# [5.0.0-pre.31](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.30...v5.0.0-pre.31) (2022-10-12) + +### Bug Fixes + +- **errors:** Allows to pass no error message ([#2794](https://github.com/feathersjs/feathers/issues/2794)) ([f3ddab6](https://github.com/feathersjs/feathers/commit/f3ddab637e269e67e852ffce07b060bab2b085c0)) + +# [5.0.0-pre.30](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.29...v5.0.0-pre.30) (2022-10-07) + +### Features + +- **core:** Allow to unregister services at runtime ([#2756](https://github.com/feathersjs/feathers/issues/2756)) ([d16601f](https://github.com/feathersjs/feathers/commit/d16601f2277dca5357866ffdefba2a611f6dc7fa)) + +# [5.0.0-pre.29](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.28...v5.0.0-pre.29) (2022-09-16) + +**Note:** Version bump only for package @feathersjs/errors + +# [5.0.0-pre.28](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.27...v5.0.0-pre.28) (2022-08-03) + +### Bug Fixes + +- **cli:** Improve generated application and client ([#2701](https://github.com/feathersjs/feathers/issues/2701)) ([bd55ffb](https://github.com/feathersjs/feathers/commit/bd55ffb812e89bf215f4515e7f137656ea888c3f)) + +# [5.0.0-pre.27](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.26...v5.0.0-pre.27) (2022-07-13) + +**Note:** Version bump only for package @feathersjs/errors + +# [5.0.0-pre.26](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.25...v5.0.0-pre.26) (2022-06-22) + +**Note:** Version bump only for package @feathersjs/errors + +# [5.0.0-pre.25](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.24...v5.0.0-pre.25) (2022-06-22) + +**Note:** Version bump only for package @feathersjs/errors + +# [5.0.0-pre.24](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.23...v5.0.0-pre.24) (2022-06-21) + +**Note:** Version bump only for package @feathersjs/errors + +# [5.0.0-pre.23](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.22...v5.0.0-pre.23) (2022-06-06) + +**Note:** Version bump only for package @feathersjs/errors + +# [5.0.0-pre.22](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.21...v5.0.0-pre.22) (2022-05-24) + +**Note:** Version bump only for package @feathersjs/errors + +# [5.0.0-pre.21](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.20...v5.0.0-pre.21) (2022-05-23) + +**Note:** Version bump only for package @feathersjs/errors + +# [5.0.0-pre.20](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.19...v5.0.0-pre.20) (2022-05-04) + +### Bug Fixes + +- **dependencies:** Lock monorepo package version numbers ([#2623](https://github.com/feathersjs/feathers/issues/2623)) ([5640c10](https://github.com/feathersjs/feathers/commit/5640c1020cc139994e695d658c08bad3494db507)) + +# [5.0.0-pre.19](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.18...v5.0.0-pre.19) (2022-05-01) + +**Note:** Version bump only for package @feathersjs/errors + +# [5.0.0-pre.18](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.17...v5.0.0-pre.18) (2022-04-11) + +**Note:** Version bump only for package @feathersjs/errors + +# [5.0.0-pre.17](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.16...v5.0.0-pre.17) (2022-02-15) + +**Note:** Version bump only for package @feathersjs/errors + +# [5.0.0-pre.16](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.15...v5.0.0-pre.16) (2022-01-12) + +**Note:** Version bump only for package @feathersjs/errors + +# [5.0.0-pre.15](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.14...v5.0.0-pre.15) (2021-11-27) + +**Note:** Version bump only for package @feathersjs/errors + +# [5.0.0-pre.14](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.13...v5.0.0-pre.14) (2021-10-13) + +**Note:** Version bump only for package @feathersjs/errors + +# [5.0.0-pre.13](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.12...v5.0.0-pre.13) (2021-10-13) + +**Note:** Version bump only for package @feathersjs/errors + +# [5.0.0-pre.12](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.11...v5.0.0-pre.12) (2021-10-12) + +**Note:** Version bump only for package @feathersjs/errors + +# [5.0.0-pre.11](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.10...v5.0.0-pre.11) (2021-10-06) + +**Note:** Version bump only for package @feathersjs/errors + +# [5.0.0-pre.10](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.9...v5.0.0-pre.10) (2021-09-19) + +**Note:** Version bump only for package @feathersjs/errors + +# [5.0.0-pre.9](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.8...v5.0.0-pre.9) (2021-08-09) + +**Note:** Version bump only for package @feathersjs/errors + +# [5.0.0-pre.8](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.7...v5.0.0-pre.8) (2021-08-09) + +**Note:** Version bump only for package @feathersjs/errors + +# [5.0.0-pre.7](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.6...v5.0.0-pre.7) (2021-08-09) + +**Note:** Version bump only for package @feathersjs/errors + +# [5.0.0-pre.6](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.5...v5.0.0-pre.6) (2021-08-08) + +**Note:** Version bump only for package @feathersjs/errors + +# [5.0.0-pre.5](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.4...v5.0.0-pre.5) (2021-06-23) + +**Note:** Version bump only for package @feathersjs/errors + +# [5.0.0-pre.4](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.3...v5.0.0-pre.4) (2021-05-13) + +**Note:** Version bump only for package @feathersjs/errors + +# [5.0.0-pre.3](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.2...v5.0.0-pre.3) (2021-04-21) + +### Bug Fixes + +- **typescript:** Improve TypeScript backwards compatibility ([#2310](https://github.com/feathersjs/feathers/issues/2310)) ([f33be73](https://github.com/feathersjs/feathers/commit/f33be73fc46a533efb15df9aab0658e3240d3897)) + +# [5.0.0-pre.2](https://github.com/feathersjs/feathers/compare/v5.0.0-beta.1...v5.0.0-pre.2) (2021-04-06) + +**Note:** Version bump only for package @feathersjs/errors + +# [5.0.0-beta.1](https://github.com/feathersjs/feathers/compare/v5.0.0-beta.0...v5.0.0-beta.1) (2021-04-03) + +**Note:** Version bump only for package @feathersjs/errors + +# [5.0.0-beta.0](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.1...v5.0.0-beta.0) (2021-03-28) + +### Bug Fixes + +- Update Grant usage and other dependencies ([#2264](https://github.com/feathersjs/feathers/issues/2264)) ([7b0f8fa](https://github.com/feathersjs/feathers/commit/7b0f8fad252419ed0ad0bf259cdf3104d322ab60)) + +# [5.0.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.5.11...v5.0.0-pre.1) (2020-12-17) + +# [5.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v4.5.4...v5.0.0-pre.0) (2020-05-19) + +### Bug Fixes + +- **errors:** Format package.json with spaces ([cbd31c1](https://github.com/feathersjs/feathers/commit/cbd31c10c2c574de63d6ca5e55dbfb73a5fdd758)) + +# [5.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v4.5.4...v5.0.0-pre.0) (2020-05-19) + +### Bug Fixes + +- **errors:** Format package.json with spaces ([cbd31c1](https://github.com/feathersjs/feathers/commit/cbd31c10c2c574de63d6ca5e55dbfb73a5fdd758)) +- **typescript:** Fix `data` property definition in @feathersjs/errors ([#2018](https://github.com/feathersjs/feathers/issues/2018)) ([ef1398c](https://github.com/feathersjs/feathers/commit/ef1398cd5b19efa50929e8c9511ca5684a18997f)) + +## [4.5.11](https://github.com/feathersjs/feathers/compare/v4.5.10...v4.5.11) (2020-12-05) + +**Note:** Version bump only for package @feathersjs/errors + +## [4.5.10](https://github.com/feathersjs/feathers/compare/v4.5.9...v4.5.10) (2020-11-08) + +**Note:** Version bump only for package @feathersjs/errors + +## [4.5.9](https://github.com/feathersjs/feathers/compare/v4.5.8...v4.5.9) (2020-10-09) + +**Note:** Version bump only for package @feathersjs/errors + +## [4.5.8](https://github.com/feathersjs/feathers/compare/v4.5.7...v4.5.8) (2020-08-12) + +**Note:** Version bump only for package @feathersjs/errors + +## [4.5.7](https://github.com/feathersjs/feathers/compare/v4.5.6...v4.5.7) (2020-07-24) + +**Note:** Version bump only for package @feathersjs/errors + +## [4.5.5](https://github.com/feathersjs/feathers/compare/v4.5.4...v4.5.5) (2020-07-11) + +**Note:** Version bump only for package @feathersjs/errors + +## [4.5.3](https://github.com/feathersjs/feathers/compare/v4.5.2...v4.5.3) (2020-04-17) + +### Bug Fixes + +- **errors:** Add 410 Gone to errors ([#1849](https://github.com/feathersjs/feathers/issues/1849)) ([6801428](https://github.com/feathersjs/feathers/commit/6801428f8fd17dbfebcdb6f1b0cd01433a4033dc)) + +## [4.5.2](https://github.com/feathersjs/feathers/compare/v4.5.1...v4.5.2) (2020-03-04) + +**Note:** Version bump only for package @feathersjs/errors + +## [4.5.1](https://github.com/feathersjs/feathers/compare/v4.5.0...v4.5.1) (2020-01-24) + +**Note:** Version bump only for package @feathersjs/errors + +# [4.5.0](https://github.com/feathersjs/feathers/compare/v4.4.3...v4.5.0) (2020-01-18) + +**Note:** Version bump only for package @feathersjs/errors + +## [4.4.3](https://github.com/feathersjs/feathers/compare/v4.4.1...v4.4.3) (2019-12-06) + +**Note:** Version bump only for package @feathersjs/errors + +## [4.4.1](https://github.com/feathersjs/feathers/compare/v4.4.0...v4.4.1) (2019-11-27) + +**Note:** Version bump only for package @feathersjs/errors + +# [4.4.0](https://github.com/feathersjs/feathers/compare/v4.3.11...v4.4.0) (2019-11-27) + +**Note:** Version bump only for package @feathersjs/errors + +## [4.3.11](https://github.com/feathersjs/feathers/compare/v4.3.10...v4.3.11) (2019-11-11) + +**Note:** Version bump only for package @feathersjs/errors + +## [4.3.10](https://github.com/feathersjs/feathers/compare/v4.3.9...v4.3.10) (2019-10-26) + +**Note:** Version bump only for package @feathersjs/errors + +## [4.3.9](https://github.com/feathersjs/feathers/compare/v4.3.8...v4.3.9) (2019-10-26) + +### Bug Fixes + +- Small type improvements ([#1624](https://github.com/feathersjs/feathers/issues/1624)) ([50162c6](https://github.com/feathersjs/feathers/commit/50162c6e562f0a47c6a280c4f01fff7c3afee293)) + +## [4.3.7](https://github.com/feathersjs/feathers/compare/v4.3.6...v4.3.7) (2019-10-14) + +**Note:** Version bump only for package @feathersjs/errors + +## [4.3.4](https://github.com/feathersjs/feathers/compare/v4.3.3...v4.3.4) (2019-10-03) + +**Note:** Version bump only for package @feathersjs/errors + +## [4.3.3](https://github.com/feathersjs/feathers/compare/v4.3.2...v4.3.3) (2019-09-21) + +**Note:** Version bump only for package @feathersjs/errors + +## [4.3.2](https://github.com/feathersjs/feathers/compare/v4.3.1...v4.3.2) (2019-09-16) + +**Note:** Version bump only for package @feathersjs/errors + +## [4.3.1](https://github.com/feathersjs/feathers/compare/v4.3.0...v4.3.1) (2019-09-09) + +**Note:** Version bump only for package @feathersjs/errors + +# [4.3.0](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.4...v4.3.0) (2019-08-27) + +**Note:** Version bump only for package @feathersjs/errors + +# [4.3.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.3...v4.3.0-pre.4) (2019-08-22) + +**Note:** Version bump only for package @feathersjs/errors + +# [4.3.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.2...v4.3.0-pre.3) (2019-08-19) + +**Note:** Version bump only for package @feathersjs/errors + +# [4.3.0-pre.2](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.1...v4.3.0-pre.2) (2019-08-02) + +**Note:** Version bump only for package @feathersjs/errors + +# [4.3.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.5...v4.3.0-pre.1) (2019-07-11) + +**Note:** Version bump only for package @feathersjs/errors + +# [4.0.0-pre.5](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.4...v4.0.0-pre.5) (2019-07-10) + +**Note:** Version bump only for package @feathersjs/errors + +# [4.0.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.3...v4.0.0-pre.4) (2019-07-05) + +**Note:** Version bump only for package @feathersjs/errors + +# [4.0.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.2...v4.0.0-pre.3) (2019-06-01) + +### Bug Fixes + +- Update dependencies and fix tests ([#1373](https://github.com/feathersjs/feathers/issues/1373)) ([d743a7f](https://github.com/feathersjs/feathers/commit/d743a7f)) + +# [4.0.0-pre.2](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.1...v4.0.0-pre.2) (2019-05-15) + +### Bug Fixes + +- Use `export =` in TypeScript definitions ([#1285](https://github.com/feathersjs/feathers/issues/1285)) ([12d0f4b](https://github.com/feathersjs/feathers/commit/12d0f4b)) + +# [4.0.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.0...v4.0.0-pre.1) (2019-05-08) + +### Bug Fixes + +- Do not log as errors below a 500 response ([#1256](https://github.com/feathersjs/feathers/issues/1256)) ([33fd0e4](https://github.com/feathersjs/feathers/commit/33fd0e4)) + +# [4.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v3.2.0-pre.1...v4.0.0-pre.0) (2019-04-21) + +### Bug Fixes + +- Make Mocha a proper devDependency for every repository ([#1053](https://github.com/feathersjs/feathers/issues/1053)) ([9974803](https://github.com/feathersjs/feathers/commit/9974803)) +- Update 401.html ([#983](https://github.com/feathersjs/feathers/issues/983)) ([cec6bae](https://github.com/feathersjs/feathers/commit/cec6bae)) +- Update 404.html ([#984](https://github.com/feathersjs/feathers/issues/984)) ([72132d1](https://github.com/feathersjs/feathers/commit/72132d1)) +- Update adapter common tests ([#1135](https://github.com/feathersjs/feathers/issues/1135)) ([8166dda](https://github.com/feathersjs/feathers/commit/8166dda)) +- Update all dependencies to latest ([#1206](https://github.com/feathersjs/feathers/issues/1206)) ([e51e0f6](https://github.com/feathersjs/feathers/commit/e51e0f6)) +- **compile-task:** on windows machine ([#60](https://github.com/feathersjs/feathers/issues/60)) ([617e0a4](https://github.com/feathersjs/feathers/commit/617e0a4)) +- **package:** update debug to version 3.0.0 ([#86](https://github.com/feathersjs/feathers/issues/86)) ([fd1bb6b](https://github.com/feathersjs/feathers/commit/fd1bb6b)) + +### Features + +- Add TypeScript definitions ([#1275](https://github.com/feathersjs/feathers/issues/1275)) ([9dd6713](https://github.com/feathersjs/feathers/commit/9dd6713)) +- Authentication v3 core server implementation ([#1205](https://github.com/feathersjs/feathers/issues/1205)) ([1bd7591](https://github.com/feathersjs/feathers/commit/1bd7591)) + +## [3.3.6](https://github.com/feathersjs/feathers/compare/@feathersjs/errors@3.3.5...@feathersjs/errors@3.3.6) (2019-01-02) + +### Bug Fixes + +- Update adapter common tests ([#1135](https://github.com/feathersjs/feathers/issues/1135)) ([8166dda](https://github.com/feathersjs/feathers/commit/8166dda)) + + + +## [3.3.5](https://github.com/feathersjs/feathers/compare/@feathersjs/errors@3.3.4...@feathersjs/errors@3.3.5) (2018-12-16) + +### Bug Fixes + +- Make Mocha a proper devDependency for every repository ([#1053](https://github.com/feathersjs/feathers/issues/1053)) ([9974803](https://github.com/feathersjs/feathers/commit/9974803)) + + + +## [3.3.4](https://github.com/feathersjs/feathers/compare/@feathersjs/errors@3.3.3...@feathersjs/errors@3.3.4) (2018-09-21) + +**Note:** Version bump only for package @feathersjs/errors + + + +## [3.3.3](https://github.com/feathersjs/feathers/compare/@feathersjs/errors@3.3.2...@feathersjs/errors@3.3.3) (2018-09-17) + +### Bug Fixes + +- Update 401.html ([#983](https://github.com/feathersjs/feathers/issues/983)) ([cec6bae](https://github.com/feathersjs/feathers/commit/cec6bae)) +- Update 404.html ([#984](https://github.com/feathersjs/feathers/issues/984)) ([72132d1](https://github.com/feathersjs/feathers/commit/72132d1)) + + + +## [3.3.2](https://github.com/feathersjs/feathers/compare/@feathersjs/errors@3.3.1...@feathersjs/errors@3.3.2) (2018-09-02) + +**Note:** Version bump only for package @feathersjs/errors + + + +## 3.3.1 + +- Migrate to Monorepo ([feathers#462](https://github.com/feathersjs/feathers/issues/462)) + +## [v3.3.0](https://github.com/feathersjs/errors/tree/v3.3.0) (2018-02-12) + +[Full Changelog](https://github.com/feathersjs/errors/compare/v3.2.2...v3.3.0) + +**Closed issues:** + +- How to handling error from Hook function when I use Aync/Await in Hook function [\#106](https://github.com/feathersjs/errors/issues/106) + +**Merged pull requests:** + +- Add a verbose flag to notFound handler [\#107](https://github.com/feathersjs/errors/pull/107) ([daffl](https://github.com/daffl)) +- Add req.url to notFound handler message [\#105](https://github.com/feathersjs/errors/pull/105) ([FreeLineTM](https://github.com/FreeLineTM)) + +## [v3.2.2](https://github.com/feathersjs/errors/tree/v3.2.2) (2018-01-23) + +[Full Changelog](https://github.com/feathersjs/errors/compare/v3.2.1...v3.2.2) + +**Closed issues:** + +- Handling Status Codes [\#103](https://github.com/feathersjs/errors/issues/103) +- Override default error page [\#102](https://github.com/feathersjs/errors/issues/102) +- wrong npm package in Installation instructions [\#100](https://github.com/feathersjs/errors/issues/100) + +**Merged pull requests:** + +- Fix instanceof and prototypical inheritance [\#104](https://github.com/feathersjs/errors/pull/104) ([nikaspran](https://github.com/nikaspran)) +- Update mocha to the latest version 🚀 [\#101](https://github.com/feathersjs/errors/pull/101) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) +- fix installation declaration [\#99](https://github.com/feathersjs/errors/pull/99) ([jasonmacgowan](https://github.com/jasonmacgowan)) + +## [v3.2.1](https://github.com/feathersjs/errors/tree/v3.2.1) (2018-01-03) + +[Full Changelog](https://github.com/feathersjs/errors/compare/v3.2.0...v3.2.1) + +**Closed issues:** + +- Error handler usage/setup is mis-documented [\#96](https://github.com/feathersjs/errors/issues/96) + +**Merged pull requests:** + +- Update readme to correspond with latest release [\#98](https://github.com/feathersjs/errors/pull/98) ([daffl](https://github.com/daffl)) +- Update semistandard to the latest version 🚀 [\#97](https://github.com/feathersjs/errors/pull/97) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) + +## [v3.2.0](https://github.com/feathersjs/errors/tree/v3.2.0) (2017-11-19) + +[Full Changelog](https://github.com/feathersjs/errors/compare/v3.1.0...v3.2.0) + +**Merged pull requests:** + +- Allow ability to log middleware errors [\#95](https://github.com/feathersjs/errors/pull/95) ([daffl](https://github.com/daffl)) + +## [v3.1.0](https://github.com/feathersjs/errors/tree/v3.1.0) (2017-11-18) + +[Full Changelog](https://github.com/feathersjs/errors/compare/v3.0.0...v3.1.0) + +**Closed issues:** + +- feature: allow for mixed files/functions for error-handler options [\#91](https://github.com/feathersjs/errors/issues/91) + +**Merged pull requests:** + +- 91 allow mixed config [\#94](https://github.com/feathersjs/errors/pull/94) ([DesignByOnyx](https://github.com/DesignByOnyx)) + +## [v3.0.0](https://github.com/feathersjs/errors/tree/v3.0.0) (2017-11-01) + +[Full Changelog](https://github.com/feathersjs/errors/compare/v3.0.0-pre.1...v3.0.0) + +**Merged pull requests:** + +- Update to Buzzard infrastructure [\#93](https://github.com/feathersjs/errors/pull/93) ([daffl](https://github.com/daffl)) + +## [v3.0.0-pre.1](https://github.com/feathersjs/errors/tree/v3.0.0-pre.1) (2017-10-21) + +[Full Changelog](https://github.com/feathersjs/errors/compare/v2.9.2...v3.0.0-pre.1) + +**Closed issues:** + +- \[Proposal\] use verror [\#88](https://github.com/feathersjs/errors/issues/88) + +**Merged pull requests:** + +- Update to new plugin infrastructure and npm scope [\#92](https://github.com/feathersjs/errors/pull/92) ([daffl](https://github.com/daffl)) +- Update mocha to the latest version 🚀 [\#90](https://github.com/feathersjs/errors/pull/90) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) +- Update sinon to the latest version 🚀 [\#89](https://github.com/feathersjs/errors/pull/89) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) + +## [v2.9.2](https://github.com/feathersjs/errors/tree/v2.9.2) (2017-09-05) + +[Full Changelog](https://github.com/feathersjs/errors/compare/v2.9.1...v2.9.2) + +**Closed issues:** + +- Getting 500 status code when attempting to throw non 500 style errors \(401\) [\#85](https://github.com/feathersjs/errors/issues/85) + +**Merged pull requests:** + +- fix typings [\#87](https://github.com/feathersjs/errors/pull/87) ([j2L4e](https://github.com/j2L4e)) +- Update debug to the latest version 🚀 [\#86](https://github.com/feathersjs/errors/pull/86) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) +- Update sinon to the latest version 🚀 [\#84](https://github.com/feathersjs/errors/pull/84) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) + +## [v2.9.1](https://github.com/feathersjs/errors/tree/v2.9.1) (2017-07-21) + +[Full Changelog](https://github.com/feathersjs/errors/compare/v2.9.0...v2.9.1) + +**Merged pull requests:** + +- Add back default error message [\#83](https://github.com/feathersjs/errors/pull/83) ([daffl](https://github.com/daffl)) + +## [v2.9.0](https://github.com/feathersjs/errors/tree/v2.9.0) (2017-07-20) + +[Full Changelog](https://github.com/feathersjs/errors/compare/v2.8.2...v2.9.0) + +**Closed issues:** + +- Wrong stack for errors [\#78](https://github.com/feathersjs/errors/issues/78) + +**Merged pull requests:** + +- Capture proper stack trace and error messages [\#82](https://github.com/feathersjs/errors/pull/82) ([daffl](https://github.com/daffl)) +- Update chai to the latest version 🚀 [\#81](https://github.com/feathersjs/errors/pull/81) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) + +## [v2.8.2](https://github.com/feathersjs/errors/tree/v2.8.2) (2017-07-05) + +[Full Changelog](https://github.com/feathersjs/errors/compare/v2.8.1...v2.8.2) + +**Merged pull requests:** + +- Fix wildcard import on ES2015+ [\#80](https://github.com/feathersjs/errors/pull/80) ([coreh](https://github.com/coreh)) +- Add more information to error debug [\#79](https://github.com/feathersjs/errors/pull/79) ([kamzil](https://github.com/kamzil)) + +## [v2.8.1](https://github.com/feathersjs/errors/tree/v2.8.1) (2017-05-30) + +[Full Changelog](https://github.com/feathersjs/errors/compare/v2.8.0...v2.8.1) + +**Merged pull requests:** + +- Fix errors property being lost when cloning [\#76](https://github.com/feathersjs/errors/pull/76) ([0x6431346e](https://github.com/0x6431346e)) + +## [v2.8.0](https://github.com/feathersjs/errors/tree/v2.8.0) (2017-05-08) + +[Full Changelog](https://github.com/feathersjs/errors/compare/v2.7.1...v2.8.0) + +**Closed issues:** + +- Support array objects as data [\#64](https://github.com/feathersjs/errors/issues/64) + +**Merged pull requests:** + +- Allow data to be an array [\#75](https://github.com/feathersjs/errors/pull/75) ([0x6431346e](https://github.com/0x6431346e)) + +## [v2.7.1](https://github.com/feathersjs/errors/tree/v2.7.1) (2017-04-28) + +[Full Changelog](https://github.com/feathersjs/errors/compare/v2.7.0...v2.7.1) + +**Closed issues:** + +- Object.setPrototypeOf in IE 10 [\#70](https://github.com/feathersjs/errors/issues/70) + +**Merged pull requests:** + +- Define property toJSON because just assigning it throws an error in N… [\#74](https://github.com/feathersjs/errors/pull/74) ([daffl](https://github.com/daffl)) + +## [v2.7.0](https://github.com/feathersjs/errors/tree/v2.7.0) (2017-04-25) + +[Full Changelog](https://github.com/feathersjs/errors/compare/v2.6.3...v2.7.0) + +**Merged pull requests:** + +- Change back to old Error inheritance [\#73](https://github.com/feathersjs/errors/pull/73) ([daffl](https://github.com/daffl)) +- Update semistandard to the latest version 🚀 [\#72](https://github.com/feathersjs/errors/pull/72) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) +- Update dependencies to enable Greenkeeper 🌴 [\#71](https://github.com/feathersjs/errors/pull/71) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) + +## [v2.6.3](https://github.com/feathersjs/errors/tree/v2.6.3) (2017-04-08) + +[Full Changelog](https://github.com/feathersjs/errors/compare/v2.6.2...v2.6.3) + +**Closed issues:** + +- Make options the same as res.format [\#37](https://github.com/feathersjs/errors/issues/37) + +**Merged pull requests:** + +- fix typescript definitions with noImplicitAny [\#69](https://github.com/feathersjs/errors/pull/69) ([JVirant](https://github.com/JVirant)) + +## [v2.6.2](https://github.com/feathersjs/errors/tree/v2.6.2) (2017-03-16) + +[Full Changelog](https://github.com/feathersjs/errors/compare/v2.6.1...v2.6.2) + +**Closed issues:** + +- Create a TokenExpired error type [\#53](https://github.com/feathersjs/errors/issues/53) + +**Merged pull requests:** + +- Fix declarations for index.d.ts [\#66](https://github.com/feathersjs/errors/pull/66) ([ghost](https://github.com/ghost)) + +## [v2.6.1](https://github.com/feathersjs/errors/tree/v2.6.1) (2017-03-06) + +[Full Changelog](https://github.com/feathersjs/errors/compare/v2.6.0...v2.6.1) + +**Merged pull requests:** + +- fix pull request \#62 [\#63](https://github.com/feathersjs/errors/pull/63) ([superbarne](https://github.com/superbarne)) + +## [v2.6.0](https://github.com/feathersjs/errors/tree/v2.6.0) (2017-03-04) + +[Full Changelog](https://github.com/feathersjs/errors/compare/v2.5.0...v2.6.0) + +**Closed issues:** + +- Full Validation Error Object not passed to client promise [\#61](https://github.com/feathersjs/errors/issues/61) +- More HTTP Statuses [\#48](https://github.com/feathersjs/errors/issues/48) + +**Merged pull requests:** + +- add typescript definitions [\#62](https://github.com/feathersjs/errors/pull/62) ([superbarne](https://github.com/superbarne)) +- Fix compile npm task on Windows [\#60](https://github.com/feathersjs/errors/pull/60) ([AbraaoAlves](https://github.com/AbraaoAlves)) + +## [v2.5.0](https://github.com/feathersjs/errors/tree/v2.5.0) (2016-11-04) + +[Full Changelog](https://github.com/feathersjs/errors/compare/v2.4.0...v2.5.0) + +**Closed issues:** + +- Possible issue with Node 4 [\#51](https://github.com/feathersjs/errors/issues/51) +- Consider using restify/errors as base [\#31](https://github.com/feathersjs/errors/issues/31) + +**Merged pull requests:** + +- Adding more error types [\#55](https://github.com/feathersjs/errors/pull/55) ([franciscofsales](https://github.com/franciscofsales)) +- 👻😱 Node.js 0.10 is unmaintained 😱👻 [\#54](https://github.com/feathersjs/errors/pull/54) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) +- jshint —\> semistandard [\#52](https://github.com/feathersjs/errors/pull/52) ([corymsmith](https://github.com/corymsmith)) +- Update mocha to version 3.0.0 🚀 [\#47](https://github.com/feathersjs/errors/pull/47) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) + +## [v2.4.0](https://github.com/feathersjs/errors/tree/v2.4.0) (2016-07-17) + +[Full Changelog](https://github.com/feathersjs/errors/compare/v2.3.0...v2.4.0) + +**Merged pull requests:** + +- adding ability to get a feathers error by http status code [\#46](https://github.com/feathersjs/errors/pull/46) ([ekryski](https://github.com/ekryski)) + +## [v2.3.0](https://github.com/feathersjs/errors/tree/v2.3.0) (2016-07-10) + +[Full Changelog](https://github.com/feathersjs/errors/compare/v2.2.0...v2.3.0) + +**Closed issues:** + +- Heroku error Reflect.construct [\#44](https://github.com/feathersjs/errors/issues/44) + +**Merged pull requests:** + +- Not found [\#45](https://github.com/feathersjs/errors/pull/45) ([ekryski](https://github.com/ekryski)) + +## [v2.2.0](https://github.com/feathersjs/errors/tree/v2.2.0) (2016-05-27) + +[Full Changelog](https://github.com/feathersjs/errors/compare/v2.1.0...v2.2.0) + +**Closed issues:** + +- Can not format error to json [\#35](https://github.com/feathersjs/errors/issues/35) + +**Merged pull requests:** + +- Add an error conversion method [\#43](https://github.com/feathersjs/errors/pull/43) ([daffl](https://github.com/daffl)) +- mocha@2.5.0 breaks build 🚨 [\#42](https://github.com/feathersjs/errors/pull/42) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) +- Update babel-plugin-add-module-exports to version 0.2.0 🚀 [\#41](https://github.com/feathersjs/errors/pull/41) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) + +## [v2.1.0](https://github.com/feathersjs/errors/tree/v2.1.0) (2016-04-03) + +[Full Changelog](https://github.com/feathersjs/errors/compare/v2.0.2...v2.1.0) + +**Closed issues:** + +- Support passing a custom html format function [\#32](https://github.com/feathersjs/errors/issues/32) + +**Merged pull requests:** + +- Custom handlers [\#36](https://github.com/feathersjs/errors/pull/36) ([ekryski](https://github.com/ekryski)) +- Update all dependencies 🌴 [\#34](https://github.com/feathersjs/errors/pull/34) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) + +## [v2.0.2](https://github.com/feathersjs/errors/tree/v2.0.2) (2016-03-23) + +[Full Changelog](https://github.com/feathersjs/errors/compare/v2.0.1...v2.0.2) + +**Closed issues:** + +- ReferenceError: Reflect is not defined [\#29](https://github.com/feathersjs/errors/issues/29) +- Make error pages opt-in [\#24](https://github.com/feathersjs/errors/issues/24) + +**Merged pull requests:** + +- Update package.json [\#33](https://github.com/feathersjs/errors/pull/33) ([marshallswain](https://github.com/marshallswain)) +- Fixed typo [\#30](https://github.com/feathersjs/errors/pull/30) ([kulakowka](https://github.com/kulakowka)) + +## [v2.0.1](https://github.com/feathersjs/errors/tree/v2.0.1) (2016-02-24) + +[Full Changelog](https://github.com/feathersjs/errors/compare/v2.0.0...v2.0.1) + +**Closed issues:** + +- Error handler is wrapping errors as GeneralErrors [\#27](https://github.com/feathersjs/errors/issues/27) + +**Merged pull requests:** + +- adding an explicit error type [\#28](https://github.com/feathersjs/errors/pull/28) ([ekryski](https://github.com/ekryski)) + +## [v2.0.0](https://github.com/feathersjs/errors/tree/v2.0.0) (2016-02-24) + +[Full Changelog](https://github.com/feathersjs/errors/compare/v1.2.4...v2.0.0) + +**Merged pull requests:** + +- move error handler out of index [\#26](https://github.com/feathersjs/errors/pull/26) ([ekryski](https://github.com/ekryski)) + +## [v1.2.4](https://github.com/feathersjs/errors/tree/v1.2.4) (2016-02-24) + +[Full Changelog](https://github.com/feathersjs/errors/compare/v1.2.3...v1.2.4) + +## [v1.2.3](https://github.com/feathersjs/errors/tree/v1.2.3) (2016-02-21) + +[Full Changelog](https://github.com/feathersjs/errors/compare/v1.2.2...v1.2.3) + +**Merged pull requests:** + +- Adding default error page and make HTML formatting optional [\#25](https://github.com/feathersjs/errors/pull/25) ([daffl](https://github.com/daffl)) + +## [v1.2.2](https://github.com/feathersjs/errors/tree/v1.2.2) (2016-02-18) + +[Full Changelog](https://github.com/feathersjs/errors/compare/v1.2.1...v1.2.2) + +**Closed issues:** + +- Add error handler back [\#21](https://github.com/feathersjs/errors/issues/21) + +**Merged pull requests:** + +- Make fully CommonJS compatible and add error middleware tests [\#23](https://github.com/feathersjs/errors/pull/23) ([daffl](https://github.com/daffl)) + +## [v1.2.1](https://github.com/feathersjs/errors/tree/v1.2.1) (2016-02-16) + +[Full Changelog](https://github.com/feathersjs/errors/compare/v1.2.0...v1.2.1) + +## [v1.2.0](https://github.com/feathersjs/errors/tree/v1.2.0) (2016-02-15) + +[Full Changelog](https://github.com/feathersjs/errors/compare/v1.1.6...v1.2.0) + +**Closed issues:** + +- Check to make sure that errors propagate via web sockets [\#1](https://github.com/feathersjs/errors/issues/1) + +**Merged pull requests:** + +- adding error handler back [\#22](https://github.com/feathersjs/errors/pull/22) ([ekryski](https://github.com/ekryski)) + +## [v1.1.6](https://github.com/feathersjs/errors/tree/v1.1.6) (2016-01-12) + +[Full Changelog](https://github.com/feathersjs/errors/compare/v1.1.5...v1.1.6) + +**Closed issues:** + +- stacktraces are incorrect when used in an ES6 app [\#20](https://github.com/feathersjs/errors/issues/20) +- We shouldn't mutate the error object passed in. [\#19](https://github.com/feathersjs/errors/issues/19) +- only one instance of babel-polyfill is allowed [\#17](https://github.com/feathersjs/errors/issues/17) + +## [v1.1.5](https://github.com/feathersjs/errors/tree/v1.1.5) (2015-12-18) + +[Full Changelog](https://github.com/feathersjs/errors/compare/v1.1.4...v1.1.5) + +## [v1.1.4](https://github.com/feathersjs/errors/tree/v1.1.4) (2015-12-15) + +[Full Changelog](https://github.com/feathersjs/errors/compare/v1.1.3...v1.1.4) + +**Closed issues:** + +- no method 'setPrototypeOf' in Node 0.10 [\#16](https://github.com/feathersjs/errors/issues/16) + +## [v1.1.3](https://github.com/feathersjs/errors/tree/v1.1.3) (2015-12-15) + +[Full Changelog](https://github.com/feathersjs/errors/compare/v1.1.2...v1.1.3) + +## [v1.1.2](https://github.com/feathersjs/errors/tree/v1.1.2) (2015-12-15) + +[Full Changelog](https://github.com/feathersjs/errors/compare/v1.1.1...v1.1.2) + +**Closed issues:** + +- Passing errors as second argument [\#9](https://github.com/feathersjs/errors/issues/9) + +## [v1.1.1](https://github.com/feathersjs/errors/tree/v1.1.1) (2015-12-14) + +[Full Changelog](https://github.com/feathersjs/errors/compare/v1.1.0...v1.1.1) + +**Closed issues:** + +- Subclassing Errors using babel don't behave as expected [\#14](https://github.com/feathersjs/errors/issues/14) + +**Merged pull requests:** + +- Es6 class fix [\#15](https://github.com/feathersjs/errors/pull/15) ([ekryski](https://github.com/ekryski)) + +## [v1.1.0](https://github.com/feathersjs/errors/tree/v1.1.0) (2015-12-12) + +[Full Changelog](https://github.com/feathersjs/errors/compare/v1.0.0...v1.1.0) + +## [v1.0.0](https://github.com/feathersjs/errors/tree/v1.0.0) (2015-12-12) + +[Full Changelog](https://github.com/feathersjs/errors/compare/0.2.5...v1.0.0) + +**Closed issues:** + +- Convert to ES6 [\#12](https://github.com/feathersjs/errors/issues/12) +- Drop the error handlers: Breaking Change [\#11](https://github.com/feathersjs/errors/issues/11) +- Remove Lodash dependency [\#10](https://github.com/feathersjs/errors/issues/10) +- Logging only unhandled errors [\#8](https://github.com/feathersjs/errors/issues/8) + +**Merged pull requests:** + +- complete rewrite. Closes \#11 and \#12. [\#13](https://github.com/feathersjs/errors/pull/13) ([ekryski](https://github.com/ekryski)) + +## [0.2.5](https://github.com/feathersjs/errors/tree/0.2.5) (2015-02-05) + +[Full Changelog](https://github.com/feathersjs/errors/compare/0.2.4...0.2.5) + +## [0.2.4](https://github.com/feathersjs/errors/tree/0.2.4) (2015-02-05) + +[Full Changelog](https://github.com/feathersjs/errors/compare/0.2.3...0.2.4) + +## [0.2.3](https://github.com/feathersjs/errors/tree/0.2.3) (2015-01-29) + +[Full Changelog](https://github.com/feathersjs/errors/compare/0.2.2...0.2.3) + +## [0.2.2](https://github.com/feathersjs/errors/tree/0.2.2) (2015-01-29) + +[Full Changelog](https://github.com/feathersjs/errors/compare/0.2.1...0.2.2) + +## [0.2.1](https://github.com/feathersjs/errors/tree/0.2.1) (2014-09-03) + +[Full Changelog](https://github.com/feathersjs/errors/compare/0.2.0...0.2.1) + +## [0.2.0](https://github.com/feathersjs/errors/tree/0.2.0) (2014-07-17) + +[Full Changelog](https://github.com/feathersjs/errors/compare/0.1.7...0.2.0) + +**Implemented enhancements:** + +- Handle error objects with an 'errors' object [\#5](https://github.com/feathersjs/errors/issues/5) + +## [0.1.7](https://github.com/feathersjs/errors/tree/0.1.7) (2014-07-06) + +[Full Changelog](https://github.com/feathersjs/errors/compare/0.1.6...0.1.7) + +## [0.1.6](https://github.com/feathersjs/errors/tree/0.1.6) (2014-07-05) + +[Full Changelog](https://github.com/feathersjs/errors/compare/0.1.5...0.1.6) + +## [0.1.5](https://github.com/feathersjs/errors/tree/0.1.5) (2014-06-13) + +[Full Changelog](https://github.com/feathersjs/errors/compare/0.1.4...0.1.5) + +## [0.1.4](https://github.com/feathersjs/errors/tree/0.1.4) (2014-06-13) + +[Full Changelog](https://github.com/feathersjs/errors/compare/0.1.3...0.1.4) + +**Closed issues:** + +- Move errors into core [\#2](https://github.com/feathersjs/errors/issues/2) + +**Merged pull requests:** + +- Core compatible [\#4](https://github.com/feathersjs/errors/pull/4) ([ekryski](https://github.com/ekryski)) + +## [0.1.3](https://github.com/feathersjs/errors/tree/0.1.3) (2014-06-09) + +[Full Changelog](https://github.com/feathersjs/errors/compare/0.1.2...0.1.3) + +**Merged pull requests:** + +- Adding a default error page [\#3](https://github.com/feathersjs/errors/pull/3) ([ekryski](https://github.com/ekryski)) + +## [0.1.2](https://github.com/feathersjs/errors/tree/0.1.2) (2014-06-05) + +[Full Changelog](https://github.com/feathersjs/errors/compare/0.1.1...0.1.2) + +## [0.1.1](https://github.com/feathersjs/errors/tree/0.1.1) (2014-06-04) + +[Full Changelog](https://github.com/feathersjs/errors/compare/v0.1.0...0.1.1) + +## [v0.1.0](https://github.com/feathersjs/errors/tree/v0.1.0) (2014-06-04) + +\* _This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)_ diff --git a/generators/package/license.tpl.ts b/packages/hooks/LICENSE similarity index 71% rename from generators/package/license.tpl.ts rename to packages/hooks/LICENSE index bf9eda766..f9b502c69 100644 --- a/generators/package/license.tpl.ts +++ b/packages/hooks/LICENSE @@ -1,14 +1,6 @@ -import { generator, renderTemplate, toFile } from '@featherscloud/pinion' -import { ModuleContext } from '../package' +The MIT License (MIT) -interface Context extends ModuleContext {} - -export const generate = (context: Context) => - generator(context).then( - renderTemplate( - `The MIT License (MIT) - -Copyright (c) ${new Date().getFullYear()} Feathers Contributors +Copyright (c) 2025 Feathers Contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -27,7 +19,3 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - `, - toFile(context.packagePath, 'LICENSE') - ) - ) diff --git a/packages/hooks/README.md b/packages/hooks/README.md new file mode 100644 index 000000000..e65ddee39 --- /dev/null +++ b/packages/hooks/README.md @@ -0,0 +1,23 @@ +# @feathersjs/errors + +[![CI](https://github.com/feathersjs/feathers/workflows/CI/badge.svg)](https://github.com/feathersjs/feathers/actions?query=workflow%3ACI) +[![Download Status](https://img.shields.io/npm/dm/@feathersjs/errors.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/errors) +[![Discord](https://badgen.net/badge/icon/discord?icon=discord&label)](https://discord.gg/qa8kez8QBx) + +> Common error types for feathers apps + +## Installation + +``` +npm install @feathersjs/errors --save +``` + +## Documentation + +Refer to the [Feathers errors API documentation](https://feathersjs.com/api/errors.html) for more details. + +## License + +Copyright (c) 2025 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) + +Licensed under the [MIT license](LICENSE). diff --git a/packages/hooks/package.json b/packages/hooks/package.json new file mode 100644 index 000000000..5b971945c --- /dev/null +++ b/packages/hooks/package.json @@ -0,0 +1,64 @@ +{ + "name": "@feathersjs/hooks", + "description": "Async middleware for JavaScript and TypeScript", + "version": "5.0.35", + "homepage": "https://feathersjs.com", + "main": "lib/index.js", + "keywords": [ + "feathers", + "feathers-plugin", + "feathers-hooks" + ], + "type": "module", + "license": "MIT", + "repository": { + "type": "git", + "url": "git://github.com/feathersjs/feathers.git", + "directory": "packages/hooks" + }, + "author": { + "name": "Feathers contributors", + "email": "hello@feathersjs.com", + "url": "https://feathersjs.com" + }, + "contributors": [], + "bugs": { + "url": "https://github.com/feathersjs/feathers/issues" + }, + "engines": { + "node": ">= 20" + }, + "directories": { + "lib": "lib" + }, + "scripts": { + "prepublish": "npm run compile", + "pack": "npm pack --pack-destination ../generators/test/build", + "compile": "shx rm -rf lib/ && tsc && npm run pack", + "test": "mocha --config ../../.mocharc.json --recursive test/**.test.ts test/**/*.test.ts" + }, + "publishConfig": { + "access": "public" + }, + "files": [ + "CHANGELOG.md", + "LICENSE", + "README.md", + "src/**", + "lib/**", + "*.d.ts", + "*.js" + ], + "devDependencies": { + "@types/mocha": "^10.0.10", + "@types/node": "^24.3.1", + "mocha": "^11.7.2", + "shx": "^0.4.0", + "ts-node": "^10.9.2", + "typescript": "^5.9.2" + }, + "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5", + "dependencies": { + "feathers": "^6.0.0-pre.2" + } +} diff --git a/packages/hooks/src/index.ts b/packages/hooks/src/index.ts new file mode 100644 index 000000000..ed9b7b972 --- /dev/null +++ b/packages/hooks/src/index.ts @@ -0,0 +1 @@ +export * from 'feathers/hooks' diff --git a/packages/hooks/test/index.test.ts b/packages/hooks/test/index.test.ts new file mode 100644 index 000000000..4da5c98bf --- /dev/null +++ b/packages/hooks/test/index.test.ts @@ -0,0 +1,432 @@ +import assert from 'assert' +import type { HookContext, NextFunction } from '../src/index.js' +import { BaseHookContext, functionHooks, getManager, hooks, middleware, setMiddleware } from '../src/index.js' +const hello = (name?: string, _params: any = {}) => { + return Promise.resolve(`Hello ${name}`) +} + +describe('feathers/hooks function', () => { + it('returns a new function, registers hooks', () => { + const fn = hooks(hello, []) + + assert.notEqual(fn, hello) + assert.notEqual(getManager(fn), null) + }) + + it('returns a new function, without hooks', () => { + const fn = hooks(hello) + + assert.notEqual(fn, hello) + assert(getManager(fn) !== null) + }) + + it('conserve name and length properties', () => { + const fn = hooks(hello, []) + + assert.strictEqual(fn.length, hello.length) + assert.strictEqual(fn.name, hello.name) + }) + + it('throws an error with non function', () => { + assert.throws(() => functionHooks({}, middleware([]))) + }) + + it('can override arguments, has context', async () => { + const addYou = async (ctx: HookContext, next: NextFunction) => { + assert(ctx instanceof BaseHookContext) + assert.deepEqual(ctx.arguments, ['There']) + ctx.arguments[0] += ' You' + + await next() + } + + const fn = hooks(hello, middleware([addYou])) + const res = await fn('There') + + assert.strictEqual(res, 'Hello There You') + }) + + it('has fn.original', async () => { + const fn = hooks( + hello, + middleware([ + async (ctx: HookContext, next: NextFunction) => { + ctx.arguments[0] += ' You' + + await next() + } + ]) + ) + + assert.strictEqual(typeof fn.original, 'function') + + assert.strictEqual(await fn.original('Dave'), 'Hello Dave') + }) + + it('can override context.result before, skips method call', async () => { + const hello = async (_name: string) => { + throw new Error('Should never get here') + } + const updateResult = async (ctx: HookContext, next: NextFunction) => { + ctx.result = 'Hello Dave' + + await next() + } + + const fn = hooks(hello, middleware([updateResult])) + const res = await fn('There') + + assert.strictEqual(res, 'Hello Dave') + }) + + it('can set context.result to undefined, skips method call, returns undefined', async () => { + const hello = async (_name: string) => { + throw new Error('Should never get here') + } + const updateResult = async (ctx: HookContext, next: NextFunction) => { + ctx.result = undefined + + await next() + } + + const fn = hooks(hello, middleware([updateResult])) + const res = await fn('There') + + assert.strictEqual(res, undefined) + }) + + it('deleting context.result, does not skip method call', async () => { + const hello = async (name: string) => { + return name + } + const updateResult = async (ctx: HookContext, next: NextFunction) => { + ctx.result = 'Dave' + + await next() + } + const deleteResult = async (ctx: HookContext, next: NextFunction) => { + delete ctx.result + + await next() + } + + const fn = hooks(hello, middleware([updateResult, deleteResult])) + const res = await fn('There') + + assert.strictEqual(res, 'There') + }) + + it('can override context.result after', async () => { + const updateResult = async (ctx: HookContext, next: NextFunction) => { + await next() + + ctx.result += ' You!' + } + + const fn = hooks(hello, middleware([updateResult])) + const res = await fn('There') + + assert.strictEqual(res, 'Hello There You!') + }) + + it('maintains the function context and sets context.self', async () => { + const hook = async function (this: any, context: HookContext, next: NextFunction) { + assert.strictEqual(obj, this) + assert.strictEqual(context.self, obj) + await next() + } + const obj: any = { + message: 'Hi', + + sayHi: hooks( + async function (this: any, name: string) { + return `${this.message} ${name}` + }, + middleware([hook]) + ) + } + const res = await obj.sayHi('Dave') + + assert.strictEqual(res, 'Hi Dave') + }) + + it('uses hooks from context object and its prototypes', async () => { + const o1 = { message: 'Hi' } + const o2 = Object.create(o1) + + setMiddleware(o1, [ + async (ctx: HookContext, next: NextFunction) => { + ctx.arguments[0] += ' o1' + + await next() + } + ]) + + setMiddleware(o2, [ + async (ctx, next) => { + ctx.arguments[0] += ' o2' + + await next() + } + ]) + + o2.sayHi = hooks( + async function (this: any, name: string) { + return `${this.message} ${name}` + }, + middleware([ + async (ctx, next) => { + ctx.arguments[0] += ' fn' + + await next() + } + ]) + ) + + const res = await o2.sayHi('Dave') + + assert.strictEqual(res, 'Hi Dave o1 o2 fn') + }) + + it('wraps an existing hooked function properly', async () => { + const one = async (ctx: HookContext, next: NextFunction) => { + await next() + + ctx.result += ' One' + } + const two = async (ctx: HookContext, next: NextFunction) => { + await next() + + ctx.result += ' Two' + } + const three = async (ctx: HookContext, next: NextFunction) => { + await next() + + ctx.result += ' Three' + } + const first = hooks(hello, middleware([one, two])) + const second = hooks(first, middleware([three])) + const mngr = getManager(second) + + if (mngr === null) { + assert(false, 'There should be a manager') + } else { + assert.deepEqual(mngr.getMiddleware(), [one, two, three]) + } + + const result = await second('Dave') + + assert.strictEqual(result, 'Hello Dave Three Two One') + }) + + it('chains context and default initializers', async () => { + const first = hooks( + hello, + middleware([], { + params: ['name'], + defaults() { + return { defaulting: true } + } + }) + ) + const second = hooks( + first, + middleware([ + async (ctx, next) => { + assert(ctx.defaulting) + ctx.name += ctx.testing + await next() + } + ]).props({ testing: ' test value' }) + ) + + const result = await second('Dave') + + assert.strictEqual(result, 'Hello Dave test value') + }) + + it('creates context with params and converts to arguments', async () => { + const fn = hooks( + hello, + middleware([ + async (ctx, next) => { + assert.strictEqual(ctx.name, 'Dave') + + ctx.name = 'Changed' + + await next() + } + ]).params('name') + ) + + assert.strictEqual(await fn('Dave'), 'Hello Changed') + }) + + it('assigns props to context', async () => { + const fn = hooks( + hello, + middleware([ + async (ctx, next) => { + assert.strictEqual(ctx.name, 'Dave') + assert.strictEqual(ctx.dev, true) + + ctx.name = 'Changed' + + await next() + } + ]) + .params('name') + .props({ dev: true }) + ) + + assert.strictEqual(await fn('Dave'), 'Hello Changed') + }) + + it('assigns props to context by options', async () => { + const fn = hooks( + hello, + middleware( + [ + async (ctx, next) => { + assert.strictEqual(ctx.name, 'Dave') + assert.strictEqual(ctx.dev, true) + + ctx.name = 'Changed' + + await next() + } + ], + { + params: ['name'], + props: { dev: true } + } + ) + ) + + assert.strictEqual(await fn('Dave'), 'Hello Changed') + }) + + it('ctx.arguments is configurable with named params', async () => { + const modifyArgs = async (ctx: HookContext, next: NextFunction) => { + ctx.arguments[0] = 'Changed' + ctx.arguments.push('no') + + assert.strictEqual(ctx.name, ctx.arguments[0]) + + await next() + } + + const fn = hooks(hello, middleware([modifyArgs]).params('name')) + + const customContext = fn.createContext() + const resultContext = await fn('Daffl', {}, customContext) + + assert.strictEqual(resultContext, customContext) + assert.deepEqual( + resultContext, + fn.createContext({ + arguments: ['Changed', {}, 'no'], + name: 'Changed', + result: 'Hello Changed' + }) + ) + }) + + it('can take and return an existing HookContext', async () => { + const message = 'Custom message' + const fn = hooks( + hello, + middleware([ + async (ctx, next) => { + assert.strictEqual(ctx.name, 'Dave') + assert.strictEqual(ctx.message, message) + + ctx.name = 'Changed' + await next() + } + ]).params('name') + ) + + const customContext = fn.createContext({ message }) + const resultContext: HookContext = await fn('Dave', {}, customContext) + + assert.strictEqual(resultContext, customContext) + assert.deepEqual( + resultContext, + fn.createContext({ + arguments: ['Changed', {}], + message: 'Custom message', + name: 'Changed', + result: 'Hello Changed' + }) + ) + }) + + it('calls middleware one time', async () => { + let called = 0 + + const sayHi = hooks( + (name: any) => `Hi ${name}`, + middleware([ + async (_context, next) => { + called++ + await next() + } + ]) + ) + + const exclamation = hooks( + sayHi, + middleware([ + async (context, next) => { + await next() + context.result += '!' + } + ]) + ) + + const result = await exclamation('Bertho') + + assert.strictEqual(result, 'Hi Bertho!') + assert.strictEqual(called, 1) + }) + + it('conserves method properties', async () => { + const TEST = Symbol('test') + const hello = (name: any) => `Hi ${name}` + ;(hello as any)[TEST] = true + + const sayHi = hooks( + hello, + middleware([ + async (context, next) => { + await next() + context.result += '!' + } + ]) + ) + + const result = await sayHi('Bertho') + + assert.strictEqual(result, 'Hi Bertho!') + assert.strictEqual((sayHi as any)[TEST], (hello as any)[TEST]) + }) + + it('works with array as middleware', async () => { + const TEST = Symbol('test') + const hello = (name: any) => `Hi ${name}` + ;(hello as any)[TEST] = true + + const sayHi = hooks(hello, [ + async (context, next) => { + await next() + context.result += '!' + } + ]) + + const result = await sayHi('Bertho') + + assert.strictEqual(result, 'Hi Bertho!') + assert.strictEqual((sayHi as any)[TEST], (hello as any)[TEST]) + }) +}) diff --git a/packages/hooks/tsconfig.json b/packages/hooks/tsconfig.json new file mode 100644 index 000000000..316fd4133 --- /dev/null +++ b/packages/hooks/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig", + "include": [ + "src/**/*.ts" + ], + "compilerOptions": { + "outDir": "lib" + } +} diff --git a/packages/knex/LICENSE b/packages/knex/LICENSE index 7712f870f..f9b502c69 100644 --- a/packages/knex/LICENSE +++ b/packages/knex/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2024 Feathers Contributors +Copyright (c) 2025 Feathers Contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -19,4 +19,3 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - diff --git a/packages/knex/README.md b/packages/knex/README.md index 61a9eb209..f5f9a0608 100644 --- a/packages/knex/README.md +++ b/packages/knex/README.md @@ -18,6 +18,6 @@ Refer to the [Feathers Knex adapter documentation](https://feathersjs.com/api/da ## License -Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) +Copyright (c) 2025 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) Licensed under the [MIT license](LICENSE). diff --git a/packages/knex/package.json b/packages/knex/package.json index 4e4c6e056..fac50678f 100644 --- a/packages/knex/package.json +++ b/packages/knex/package.json @@ -3,7 +3,8 @@ "description": "Feathers SQL service adapter using KnexJS", "version": "5.0.35", "homepage": "https://feathersjs.com", - "main": "lib/", + "main": "lib/index.js", + "type": "module", "keywords": [ "feathers", "feathers-plugin" @@ -27,7 +28,7 @@ "url": "https://github.com/feathersjs/feathers/issues" }, "engines": { - "node": ">= 14" + "node": ">= 20" }, "files": [ "CHANGELOG.md", diff --git a/packages/knex/src/adapter.ts b/packages/knex/src/adapter.ts index a9751c72a..00f044173 100644 --- a/packages/knex/src/adapter.ts +++ b/packages/knex/src/adapter.ts @@ -1,11 +1,12 @@ -import { Id, NullableId, Paginated, Query } from '@feathersjs/feathers' +import type { Id, NullableId, Paginated, Query } from '@feathersjs/feathers' import { _ } from '@feathersjs/commons' -import { AdapterBase, PaginationOptions, AdapterQuery, getLimit } from '@feathersjs/adapter-commons' +import type { PaginationOptions, AdapterQuery } from '@feathersjs/adapter-commons' +import { AdapterBase, getLimit } from '@feathersjs/adapter-commons' import { BadRequest, MethodNotAllowed, NotFound } from '@feathersjs/errors' import { Knex } from 'knex' -import { errorHandler } from './error-handler' -import { KnexAdapterOptions, KnexAdapterParams } from './declarations' +import { errorHandler } from './error-handler.js' +import type { KnexAdapterOptions, KnexAdapterParams } from './declarations.js' const METHODS = { $ne: 'whereNot', $in: 'whereIn', diff --git a/packages/knex/src/declarations.ts b/packages/knex/src/declarations.ts index 6a4429fd8..59443146c 100644 --- a/packages/knex/src/declarations.ts +++ b/packages/knex/src/declarations.ts @@ -1,6 +1,5 @@ import { Knex } from 'knex' -import { AdapterServiceOptions, AdapterParams, AdapterQuery } from '@feathersjs/adapter-commons' - +import type { AdapterServiceOptions, AdapterParams, AdapterQuery } from '@feathersjs/adapter-commons' export interface KnexAdapterOptions extends AdapterServiceOptions { Model: Knex name: string diff --git a/packages/knex/src/hooks.ts b/packages/knex/src/hooks.ts index fe91519c2..d4cf63ef0 100644 --- a/packages/knex/src/hooks.ts +++ b/packages/knex/src/hooks.ts @@ -1,7 +1,7 @@ import { createDebug } from '@feathersjs/commons' -import { HookContext } from '@feathersjs/feathers' +import type { HookContext } from '@feathersjs/feathers' import { Knex } from 'knex' -import { KnexAdapterTransaction } from './declarations' +import { KnexAdapterTransaction } from './declarations.js' const debug = createDebug('feathers-knex-transaction') diff --git a/packages/knex/src/index.ts b/packages/knex/src/index.ts index 7f2c34730..7f04ab8fc 100644 --- a/packages/knex/src/index.ts +++ b/packages/knex/src/index.ts @@ -1,13 +1,12 @@ -import { PaginationOptions } from '@feathersjs/adapter-commons' -import { MethodNotAllowed } from '@feathersjs/errors/lib' -import { Paginated, ServiceMethods, Id, NullableId, Params } from '@feathersjs/feathers' -import { KnexAdapter } from './adapter' -import { KnexAdapterParams } from './declarations' - -export * from './declarations' -export * from './adapter' -export * from './error-handler' -export * as transaction from './hooks' +import type { PaginationOptions } from '@feathersjs/adapter-commons' +import { MethodNotAllowed } from '@feathersjs/errors' +import type { Paginated, ServiceMethods, Id, NullableId, Params } from '@feathersjs/feathers' +import { KnexAdapter } from './adapter.js' +import type { KnexAdapterParams } from './declarations.js' +export * from './declarations.js' +export * from './adapter.js' +export * from './error-handler.js' +export * as transaction from './hooks.js' export class KnexService< Result = any, diff --git a/packages/knex/test/error-handler.test.ts b/packages/knex/test/error-handler.test.ts index 04723a45d..9676b1afa 100644 --- a/packages/knex/test/error-handler.test.ts +++ b/packages/knex/test/error-handler.test.ts @@ -1,5 +1,5 @@ import assert from 'assert' -import { errorHandler } from '../src' +import { errorHandler } from '../src/index.js' describe('Knex Error handler', () => { it('sqlState', () => { diff --git a/packages/knex/test/index.test.ts b/packages/knex/test/index.test.ts index 475ec3ff1..d77b71a47 100644 --- a/packages/knex/test/index.test.ts +++ b/packages/knex/test/index.test.ts @@ -1,14 +1,15 @@ -import knex, { Knex } from 'knex' +import knex, { type Knex } from 'knex' import assert from 'assert' -import { feathers, HookContext, Service } from '@feathersjs/feathers' +import type { HookContext, Service } from '@feathersjs/feathers' +import { feathers } from '@feathersjs/feathers' import adapterTests from '@feathersjs/adapter-tests' import { errors } from '@feathersjs/errors' import { Ajv, getValidator, querySyntax, hooks } from '@feathersjs/schema' -import connection from './connection' -import { ERROR, KnexAdapterParams, KnexService, transaction } from '../src/index' -import { AdapterQuery } from '@feathersjs/adapter-commons/lib' - +import connection from './connection.js' +import type { KnexAdapterParams } from '../src/index.js' +import { ERROR, KnexService, transaction } from '../src/index.js' +import type { AdapterQuery } from '@feathersjs/adapter-commons' const testSuite = adapterTests([ '.options', '.events', diff --git a/packages/knex/test/overrides.test.ts b/packages/knex/test/overrides.test.ts index dcd0f1fad..170880f46 100644 --- a/packages/knex/test/overrides.test.ts +++ b/packages/knex/test/overrides.test.ts @@ -1,9 +1,10 @@ import knex from 'knex' import assert from 'assert' -import { feathers, Paginated } from '@feathersjs/feathers' -import { KnexAdapterParams, KnexService, transaction } from '../src' -import { PaginationOptions } from '@feathersjs/adapter-commons' - +import type { Paginated } from '@feathersjs/feathers' +import { feathers } from '@feathersjs/feathers' +import type { KnexAdapterParams } from '../src/index.js' +import { KnexService, transaction } from '../src/index.js' +import type { PaginationOptions } from '@feathersjs/adapter-commons' // const { transaction } = service.hooks const db = knex({ diff --git a/packages/koa/README.md b/packages/koa/README.md index 3f0fba26d..439e9a0aa 100644 --- a/packages/koa/README.md +++ b/packages/koa/README.md @@ -18,6 +18,6 @@ Refer to the [Feathers Koa API documentation](https://feathersjs.com/api/koa.htm ## License -Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) +Copyright (c) 2025 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) Licensed under the [MIT license](LICENSE). diff --git a/packages/koa/package.json b/packages/koa/package.json index bc06de6ff..2009a3af4 100644 --- a/packages/koa/package.json +++ b/packages/koa/package.json @@ -3,8 +3,8 @@ "description": "Feathers KoaJS framework bindings and REST provider", "version": "5.0.35", "homepage": "https://feathersjs.com", - "main": "lib/", - "types": "lib/", + "main": "lib/index.js", + "type": "module", "keywords": [ "feathers", "koajs" @@ -25,7 +25,7 @@ "url": "https://github.com/feathersjs/feathers/issues" }, "engines": { - "node": ">= 14" + "node": ">= 20" }, "files": [ "CHANGELOG.md", @@ -55,7 +55,7 @@ "@feathersjs/feathers": "^5.0.35", "@feathersjs/transport-commons": "^5.0.35", "@koa/cors": "^5.0.0", - "@types/koa": "^2.15.0", + "@types/koa": "^3.0.0", "@types/koa-qs": "^2.0.3", "@types/koa-static": "^4.0.4", "@types/koa__cors": "^5.0.0", diff --git a/packages/koa/src/authentication.ts b/packages/koa/src/authentication.ts index a84e99cdb..b4557ec7a 100644 --- a/packages/koa/src/authentication.ts +++ b/packages/koa/src/authentication.ts @@ -1,9 +1,8 @@ -import { Application, HookContext } from '@feathersjs/feathers' +import type { Application, HookContext } from '@feathersjs/feathers' import { createDebug } from '@feathersjs/commons' import { authenticate as AuthenticateHook } from '@feathersjs/authentication' -import { Middleware } from './declarations' - +import type { Middleware } from './declarations.js' const debug = createDebug('@feathersjs/koa/authentication') export type AuthenticationSettings = { diff --git a/packages/koa/src/declarations.ts b/packages/koa/src/declarations.ts index 7ae1ff50f..a9a40172a 100644 --- a/packages/koa/src/declarations.ts +++ b/packages/koa/src/declarations.ts @@ -1,6 +1,11 @@ import Koa, { Next } from 'koa' import { Server } from 'http' -import { Application as FeathersApplication, HookContext, Params, RouteLookup } from '@feathersjs/feathers' +import type { + Application as FeathersApplication, + HookContext, + Params, + RouteLookup +} from '@feathersjs/feathers' import '@feathersjs/authentication' export type ApplicationAddons = { @@ -18,7 +23,7 @@ export type FeathersKoaContext = Koa.Context & { export type Middleware = (context: FeathersKoaContext, next: Next) => any -declare module '@feathersjs/feathers/lib/declarations' { +declare module '@feathersjs/feathers' { interface ServiceOptions { koa?: { before?: Middleware[] diff --git a/packages/koa/src/handlers.ts b/packages/koa/src/handlers.ts index 3c1a1aa21..319cdea3d 100644 --- a/packages/koa/src/handlers.ts +++ b/packages/koa/src/handlers.ts @@ -1,5 +1,5 @@ import { FeathersError, NotFound } from '@feathersjs/errors' -import { FeathersKoaContext } from './declarations' +import { FeathersKoaContext } from './declarations.js' export const errorHandler = () => async (ctx: FeathersKoaContext, next: () => Promise) => { try { diff --git a/packages/koa/src/index.ts b/packages/koa/src/index.ts index 8969ec7eb..e9c989e40 100644 --- a/packages/koa/src/index.ts +++ b/packages/koa/src/index.ts @@ -1,19 +1,17 @@ import Koa from 'koa' import koaQs from 'koa-qs' -import { Application as FeathersApplication } from '@feathersjs/feathers' -import { routing } from '@feathersjs/transport-commons' +import type { Application as FeathersApplication } from '@feathersjs/feathers' import { createDebug } from '@feathersjs/commons' import { koaBody as bodyParser } from 'koa-body' import cors from '@koa/cors' import serveStatic from 'koa-static' -import { Application } from './declarations' - +import type { Application } from './declarations.js' export { Koa, bodyParser, cors, serveStatic } -export * from './authentication' -export * from './declarations' -export * from './handlers' -export * from './rest' +export * from './authentication.js' +export * from './declarations.js' +export * from './handlers.js' +export * from './rest.js' const debug = createDebug('@feathersjs/koa') @@ -99,7 +97,6 @@ export function koa( app.setup = feathersApp.setup as any app.teardown = feathersApp.teardown as any - app.configure(routing() as any) app.use((ctx, next) => { ctx.feathers = { ...ctx.feathers, provider: 'rest' } return next() diff --git a/packages/koa/src/rest.ts b/packages/koa/src/rest.ts index 42ab0d5ab..6c268f967 100644 --- a/packages/koa/src/rest.ts +++ b/packages/koa/src/rest.ts @@ -4,8 +4,8 @@ import { createDebug } from '@feathersjs/commons' import { getServiceOptions, defaultServiceMethods, createContext } from '@feathersjs/feathers' import { MethodNotAllowed } from '@feathersjs/errors' -import { Application, Middleware } from './declarations' -import { AuthenticationSettings, parseAuthentication } from './authentication' +import type { Application, Middleware } from './declarations.js' +import { AuthenticationSettings, parseAuthentication } from './authentication.js' const debug = createDebug('@feathersjs/koa/rest') diff --git a/packages/koa/test/app.fixture.ts b/packages/koa/test/app.fixture.ts index c6427fb49..31b506049 100644 --- a/packages/koa/test/app.fixture.ts +++ b/packages/koa/test/app.fixture.ts @@ -1,9 +1,10 @@ import { memory } from '@feathersjs/memory' -import { feathers, Params, HookContext } from '@feathersjs/feathers' +import type { Params, HookContext } from '@feathersjs/feathers' +import { feathers } from '@feathersjs/feathers' import { authenticate, AuthenticationService, JWTStrategy } from '@feathersjs/authentication' import { LocalStrategy, hooks } from '@feathersjs/authentication-local' -import { koa, rest, bodyParser, errorHandler, cors } from '../src' +import { koa, rest, bodyParser, errorHandler, cors } from '../src/index.js' const { protect, hashPassword } = hooks const app = koa(feathers()) diff --git a/packages/koa/test/authentication.test.ts b/packages/koa/test/authentication.test.ts index ffdf374bf..7cc7db011 100644 --- a/packages/koa/test/authentication.test.ts +++ b/packages/koa/test/authentication.test.ts @@ -1,8 +1,7 @@ import { strict as assert } from 'assert' import _axios from 'axios' -import { AuthenticationResult } from '@feathersjs/authentication' - -import app from './app.fixture' +import type { AuthenticationResult } from '@feathersjs/authentication' +import app from './app.fixture.js' const axios = _axios.create({ baseURL: 'http://localhost:9776/' diff --git a/packages/koa/test/index.test.ts b/packages/koa/test/index.test.ts index 445b14023..dba54377c 100644 --- a/packages/koa/test/index.test.ts +++ b/packages/koa/test/index.test.ts @@ -1,10 +1,12 @@ import { strict as assert } from 'assert' import Koa from 'koa' import axios from 'axios' -import { ApplicationHookMap, feathers, Id } from '@feathersjs/feathers' -import { Service, restTests } from '@feathersjs/tests' -import { koa, rest, Application, bodyParser, errorHandler } from '../src' - +import type { ApplicationHookMap, Id } from '@feathersjs/feathers' +import { feathers } from '@feathersjs/feathers' +import { Service } from '@feathersjs/tests' +import { restTests } from '@feathersjs/tests' +import type { Application } from '../src/index.js' +import { koa, rest, bodyParser, errorHandler } from '../src/index.js' describe('@feathersjs/koa', () => { let app: Application diff --git a/packages/memory/LICENSE b/packages/memory/LICENSE index 7712f870f..f9b502c69 100644 --- a/packages/memory/LICENSE +++ b/packages/memory/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2024 Feathers Contributors +Copyright (c) 2025 Feathers Contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -19,4 +19,3 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - diff --git a/packages/memory/README.md b/packages/memory/README.md index c69468678..879519149 100644 --- a/packages/memory/README.md +++ b/packages/memory/README.md @@ -18,6 +18,6 @@ See [FeathersJS Memory Adapter API documentation](https://feathersjs.com/api/dat ## License -Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) +Copyright (c) 2025 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) Licensed under the [MIT license](LICENSE). diff --git a/packages/memory/package.json b/packages/memory/package.json index 7e2a274ca..63728c076 100644 --- a/packages/memory/package.json +++ b/packages/memory/package.json @@ -3,8 +3,8 @@ "description": "An in memory service store", "version": "5.0.35", "homepage": "https://github.com/feathersjs/feathers", - "main": "lib/", - "types": "lib/", + "main": "lib/index.js", + "type": "module", "keywords": [ "feathers", "feathers-plugin" @@ -25,7 +25,7 @@ "url": "https://github.com/feathersjs/feathers/issues" }, "engines": { - "node": ">= 12" + "node": ">= 20" }, "files": [ "CHANGELOG.md", diff --git a/packages/memory/src/index.ts b/packages/memory/src/index.ts index 543592aec..db5c6443b 100644 --- a/packages/memory/src/index.ts +++ b/packages/memory/src/index.ts @@ -1,16 +1,9 @@ import { BadRequest, MethodNotAllowed, NotFound } from '@feathersjs/errors' import { _ } from '@feathersjs/commons' -import { - sorter, - select, - AdapterBase, - AdapterServiceOptions, - PaginationOptions, - AdapterParams -} from '@feathersjs/adapter-commons' +import type { AdapterServiceOptions, PaginationOptions, AdapterParams } from '@feathersjs/adapter-commons' +import { sorter, select, AdapterBase } from '@feathersjs/adapter-commons' import sift from 'sift' -import { NullableId, Id, Params, Paginated } from '@feathersjs/feathers' - +import type { NullableId, Id, Params, Paginated } from '@feathersjs/feathers' export interface MemoryServiceStore { [key: string]: T } diff --git a/packages/memory/test/index.test.ts b/packages/memory/test/index.test.ts index 1b25ba59a..d6a1afc18 100644 --- a/packages/memory/test/index.test.ts +++ b/packages/memory/test/index.test.ts @@ -1,9 +1,9 @@ import assert from 'assert' import adapterTests from '@feathersjs/adapter-tests' -import errors from '@feathersjs/errors' +import * as errors from '@feathersjs/errors' import { feathers } from '@feathersjs/feathers' -import { MemoryService } from '../src' +import { MemoryService } from '../src/index.js' const testSuite = adapterTests([ '.options', diff --git a/packages/mongodb/LICENSE b/packages/mongodb/LICENSE index 7712f870f..f9b502c69 100644 --- a/packages/mongodb/LICENSE +++ b/packages/mongodb/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2024 Feathers Contributors +Copyright (c) 2025 Feathers Contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -19,4 +19,3 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - diff --git a/packages/mongodb/README.md b/packages/mongodb/README.md index 4cfca9afe..e432c9970 100644 --- a/packages/mongodb/README.md +++ b/packages/mongodb/README.md @@ -18,6 +18,6 @@ Refer to the [Feathers MongoDB adapter documentation](https://feathersjs.com/api ## License -Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) +Copyright (c) 2025 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) Licensed under the [MIT license](LICENSE). diff --git a/packages/mongodb/package.json b/packages/mongodb/package.json index 1a0451cbb..72a1ed18e 100644 --- a/packages/mongodb/package.json +++ b/packages/mongodb/package.json @@ -3,7 +3,8 @@ "description": "Feathers MongoDB service adapter", "version": "5.0.35", "homepage": "https://feathersjs.com", - "main": "lib/", + "main": "lib/index.js", + "type": "module", "keywords": [ "feathers", "feathers-plugin" @@ -27,7 +28,7 @@ "url": "https://github.com/feathersjs/feathers/issues" }, "engines": { - "node": ">= 14" + "node": ">= 20" }, "files": [ "CHANGELOG.md", diff --git a/packages/mongodb/src/adapter.ts b/packages/mongodb/src/adapter.ts index 2b4a2036a..a6da6596d 100644 --- a/packages/mongodb/src/adapter.ts +++ b/packages/mongodb/src/adapter.ts @@ -14,16 +14,15 @@ import { } from 'mongodb' import { BadRequest, MethodNotAllowed, NotFound } from '@feathersjs/errors' import { _ } from '@feathersjs/commons' -import { - AdapterBase, +import type { AdapterParams, AdapterServiceOptions, PaginationOptions, - AdapterQuery, - getLimit + AdapterQuery } from '@feathersjs/adapter-commons' -import { Id, Paginated } from '@feathersjs/feathers' -import { errorHandler } from './error-handler' +import { AdapterBase, getLimit } from '@feathersjs/adapter-commons' +import type { Id, Paginated } from '@feathersjs/feathers' +import { errorHandler } from './error-handler.js' export interface MongoDBAdapterOptions extends AdapterServiceOptions { Model: Collection | Promise diff --git a/packages/mongodb/src/index.ts b/packages/mongodb/src/index.ts index 04e8d3167..be4dd7a80 100644 --- a/packages/mongodb/src/index.ts +++ b/packages/mongodb/src/index.ts @@ -1,11 +1,11 @@ -import { PaginationOptions } from '@feathersjs/adapter-commons' -import { MethodNotAllowed } from '@feathersjs/errors/lib' -import { Paginated, Params } from '@feathersjs/feathers' -import { AdapterId, MongoDbAdapter, MongoDBAdapterParams, NullableAdapterId } from './adapter' +import type { PaginationOptions } from '@feathersjs/adapter-commons' +import { MethodNotAllowed } from '@feathersjs/errors' +import type { Paginated, Params } from '@feathersjs/feathers' +import { AdapterId, MongoDbAdapter, MongoDBAdapterParams, NullableAdapterId } from './adapter.js' -export * from './adapter' -export * from './error-handler' -export * from './converters' +export * from './adapter.js' +export * from './error-handler.js' +export * from './converters.js' export class MongoDBService< Result = any, diff --git a/packages/mongodb/test/converters.test.ts b/packages/mongodb/test/converters.test.ts index f8d965e8c..277b383cd 100644 --- a/packages/mongodb/test/converters.test.ts +++ b/packages/mongodb/test/converters.test.ts @@ -1,7 +1,7 @@ import { Ajv } from '@feathersjs/schema' import assert from 'assert' import { ObjectId } from 'mongodb' -import { keywordObjectId, resolveObjectId, resolveQueryObjectId } from '../src' +import { keywordObjectId, resolveObjectId, resolveQueryObjectId } from '../src/index.js' describe('ObjectId resolvers', () => { it('resolveObjectId', async () => { diff --git a/packages/mongodb/test/index.test.ts b/packages/mongodb/test/index.test.ts index 5d3d2f6fc..73d7e1c38 100644 --- a/packages/mongodb/test/index.test.ts +++ b/packages/mongodb/test/index.test.ts @@ -2,10 +2,11 @@ import { Db, MongoClient, ObjectId } from 'mongodb' import adapterTests from '@feathersjs/adapter-tests' import assert from 'assert' import { MongoMemoryServer } from 'mongodb-memory-server' -import { Ajv, FromSchema, getValidator, hooks, querySyntax } from '@feathersjs/schema' +import type { FromSchema } from '@feathersjs/schema' +import { Ajv, getValidator, hooks, querySyntax } from '@feathersjs/schema' import { feathers } from '@feathersjs/feathers' -import errors from '@feathersjs/errors' -import { MongoDBService, AdapterId } from '../src' +import * as errors from '@feathersjs/errors' +import { MongoDBService, type AdapterId } from '../src/index.js' const testSuite = adapterTests([ '.options', diff --git a/packages/rest-client/LICENSE b/packages/rest-client/LICENSE index 7712f870f..f9b502c69 100644 --- a/packages/rest-client/LICENSE +++ b/packages/rest-client/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2024 Feathers Contributors +Copyright (c) 2025 Feathers Contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -19,4 +19,3 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - diff --git a/packages/rest-client/README.md b/packages/rest-client/README.md index a43e3e8e7..48a541ab4 100644 --- a/packages/rest-client/README.md +++ b/packages/rest-client/README.md @@ -18,6 +18,6 @@ Refer to the [Feathers REST client API documentation](https://feathersjs.com/api ## License -Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) +Copyright (c) 2025 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) Licensed under the [MIT license](LICENSE). diff --git a/packages/rest-client/package.json b/packages/rest-client/package.json index 36b11465c..85c460ec5 100644 --- a/packages/rest-client/package.json +++ b/packages/rest-client/package.json @@ -3,8 +3,8 @@ "description": "REST client services for different Ajax libraries", "version": "5.0.35", "homepage": "https://feathersjs.com", - "main": "lib/", - "types": "lib/", + "main": "lib/index.js", + "type": "module", "keywords": [ "feathers", "feathers-plugin" @@ -29,7 +29,7 @@ "url": "https://github.com/feathersjs/feathers/issues" }, "engines": { - "node": ">= 12" + "node": ">= 20" }, "files": [ "CHANGELOG.md", @@ -65,11 +65,9 @@ "@feathersjs/tests": "^5.0.35", "@types/mocha": "^10.0.10", "@types/node": "^24.3.1", - "@types/node-fetch": "^2.6.13", "@types/qs": "^6.14.0", "axios": "^1.11.0", "mocha": "^11.7.2", - "node-fetch": "^2.6.1", "rxjs": "^7.8.2", "shx": "^0.4.0", "superagent": "^10.2.3", diff --git a/packages/rest-client/src/axios.ts b/packages/rest-client/src/axios.ts index 16a219486..3ede6233a 100644 --- a/packages/rest-client/src/axios.ts +++ b/packages/rest-client/src/axios.ts @@ -1,5 +1,5 @@ -import { Params } from '@feathersjs/feathers' -import { Base, RestClientParams } from './base' +import type { Params } from '@feathersjs/feathers' +import { Base, RestClientParams } from './base.js' export class AxiosClient, P extends Params = RestClientParams> extends Base { request(options: any, params: RestClientParams) { diff --git a/packages/rest-client/src/base.ts b/packages/rest-client/src/base.ts index 6e337d784..edcadb971 100644 --- a/packages/rest-client/src/base.ts +++ b/packages/rest-client/src/base.ts @@ -1,5 +1,5 @@ import qs from 'qs' -import { Params, Id, Query, NullableId, ServiceInterface } from '@feathersjs/feathers' +import type { Params, Id, Query, NullableId, ServiceInterface } from '@feathersjs/feathers' import { Unavailable, convert } from '@feathersjs/errors' import { _, stripSlashes } from '@feathersjs/commons' diff --git a/packages/rest-client/src/fetch.ts b/packages/rest-client/src/fetch.ts index 724fbfc29..ca657ece8 100644 --- a/packages/rest-client/src/fetch.ts +++ b/packages/rest-client/src/fetch.ts @@ -1,6 +1,6 @@ import { errors } from '@feathersjs/errors' -import { Params } from '@feathersjs/feathers' -import { Base, RestClientParams } from './base' +import type { Params } from '@feathersjs/feathers' +import { Base, RestClientParams } from './base.js' export class FetchClient, P extends Params = RestClientParams> extends Base { request(options: any, params: RestClientParams) { diff --git a/packages/rest-client/src/index.ts b/packages/rest-client/src/index.ts index d0afbaf7a..d1b1cdf45 100644 --- a/packages/rest-client/src/index.ts +++ b/packages/rest-client/src/index.ts @@ -1,9 +1,9 @@ -import { Application, TransportConnection, defaultServiceMethods } from '@feathersjs/feathers' - -import { Base } from './base' -import { AxiosClient } from './axios' -import { FetchClient } from './fetch' -import { SuperagentClient } from './superagent' +import type { Application, TransportConnection } from '@feathersjs/feathers' +import { defaultServiceMethods } from '@feathersjs/feathers' +import { Base } from './base.js' +import { AxiosClient } from './axios.js' +import { FetchClient } from './fetch.js' +import { SuperagentClient } from './superagent.js' export { AxiosClient, FetchClient, SuperagentClient } diff --git a/packages/rest-client/src/superagent.ts b/packages/rest-client/src/superagent.ts index d93474b69..6400999ba 100644 --- a/packages/rest-client/src/superagent.ts +++ b/packages/rest-client/src/superagent.ts @@ -1,5 +1,5 @@ -import { Params } from '@feathersjs/feathers' -import { Base, RestClientParams } from './base' +import type { Params } from '@feathersjs/feathers' +import { Base, RestClientParams } from './base.js' export class SuperagentClient, P extends Params = RestClientParams> extends Base< T, diff --git a/packages/rest-client/test/axios.test.ts b/packages/rest-client/test/axios.test.ts index 16cfe9635..a685b8858 100644 --- a/packages/rest-client/test/axios.test.ts +++ b/packages/rest-client/test/axios.test.ts @@ -6,9 +6,9 @@ import { feathers } from '@feathersjs/feathers' import { clientTests } from '@feathersjs/tests' import { NotAcceptable } from '@feathersjs/errors' -import createServer from './server' -import rest from '../src' -import { ServiceTypes } from './declarations' +import createServer from './server.js' +import rest from '../src/index.js' +import type { ServiceTypes } from './declarations.js' describe('Axios REST connector', function () { const url = 'http://localhost:8889' diff --git a/packages/rest-client/test/declarations.ts b/packages/rest-client/test/declarations.ts index a29a067e1..dccb87bfa 100644 --- a/packages/rest-client/test/declarations.ts +++ b/packages/rest-client/test/declarations.ts @@ -1,5 +1,5 @@ -import { CustomMethod } from '@feathersjs/feathers' -import { RestService } from '../src' +import type { CustomMethod } from '@feathersjs/feathers' +import { RestService } from '../src/index.js' type Data = { message: string } type Result = { diff --git a/packages/rest-client/test/fetch.test.ts b/packages/rest-client/test/fetch.test.ts index 54ea3cec8..d0a270057 100644 --- a/packages/rest-client/test/fetch.test.ts +++ b/packages/rest-client/test/fetch.test.ts @@ -1,13 +1,12 @@ import { strict as assert } from 'assert' -import fetch from 'node-fetch' import { feathers } from '@feathersjs/feathers' import { clientTests } from '@feathersjs/tests' import { NotAcceptable } from '@feathersjs/errors' import { Server } from 'http' -import rest from '../src' -import createServer from './server' -import { ServiceTypes } from './declarations' +import rest from '../src/index.js' +import createServer from './server.js' +import type { ServiceTypes } from './declarations.js' describe('fetch REST connector', function () { const url = 'http://localhost:8889' diff --git a/packages/rest-client/test/index.test.ts b/packages/rest-client/test/index.test.ts index d81c98407..c0078b635 100644 --- a/packages/rest-client/test/index.test.ts +++ b/packages/rest-client/test/index.test.ts @@ -1,8 +1,6 @@ -/* eslint-disable @typescript-eslint/ban-ts-comment */ -import fetch from 'node-fetch' import { strict as assert } from 'assert' import { feathers } from '@feathersjs/feathers' -import { default as init, FetchClient } from '../src' +import { default as init, FetchClient } from '../src/index.js' describe('REST client tests', function () { it('is built correctly', () => { @@ -18,7 +16,7 @@ describe('REST client tests', function () { const transports = init() try { - // @ts-ignore + // @ts-expect-error Test usage with invalid arguments transports.fetch() } catch (e: any) { assert.strictEqual(e.message, 'fetch has to be provided to feathers-rest') diff --git a/packages/rest-client/test/server.ts b/packages/rest-client/test/server.ts index 6027f4718..f8b10fe7c 100644 --- a/packages/rest-client/test/server.ts +++ b/packages/rest-client/test/server.ts @@ -1,4 +1,5 @@ -import { feathers, Id, NullableId, Params } from '@feathersjs/feathers' +import type { Id, NullableId, Params } from '@feathersjs/feathers' +import { feathers } from '@feathersjs/feathers' import expressify, { rest, urlencoded, json } from '@feathersjs/express' import { MemoryService } from '@feathersjs/memory' import { FeathersError, NotAcceptable } from '@feathersjs/errors' diff --git a/packages/rest-client/test/superagent.test.ts b/packages/rest-client/test/superagent.test.ts index 7e705b428..43da49b3d 100644 --- a/packages/rest-client/test/superagent.test.ts +++ b/packages/rest-client/test/superagent.test.ts @@ -6,9 +6,9 @@ import { feathers } from '@feathersjs/feathers' import { clientTests } from '@feathersjs/tests' import { NotAcceptable } from '@feathersjs/errors' -import rest from '../src' -import createServer from './server' -import { ServiceTypes } from './declarations' +import rest from '../src/index.js' +import createServer from './server.js' +import type { ServiceTypes } from './declarations.js' describe('Superagent REST connector', function () { let server: Server diff --git a/packages/schema/LICENSE b/packages/schema/LICENSE index 7712f870f..f9b502c69 100644 --- a/packages/schema/LICENSE +++ b/packages/schema/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2024 Feathers Contributors +Copyright (c) 2025 Feathers Contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -19,4 +19,3 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - diff --git a/packages/schema/README.md b/packages/schema/README.md index 8a893572e..75e2dc2c0 100644 --- a/packages/schema/README.md +++ b/packages/schema/README.md @@ -18,6 +18,6 @@ Refer to the [Feathers schema API documentation](https://feathersjs.com/api/sche ## License -Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) +Copyright (c) 2025 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) Licensed under the [MIT license](LICENSE). diff --git a/packages/schema/package.json b/packages/schema/package.json index fa99bef41..124cbfd33 100644 --- a/packages/schema/package.json +++ b/packages/schema/package.json @@ -3,8 +3,8 @@ "description": "A common data schema definition format", "version": "5.0.35", "homepage": "https://feathersjs.com", - "main": "lib/", - "types": "lib/", + "main": "lib/index.js", + "type": "module", "keywords": [ "feathers", "feathers-plugin" @@ -29,7 +29,7 @@ "url": "https://github.com/feathersjs/feathers/issues" }, "engines": { - "node": ">= 12" + "node": ">= 20" }, "files": [ "CHANGELOG.md", @@ -58,7 +58,7 @@ "@feathersjs/commons": "^5.0.35", "@feathersjs/errors": "^5.0.35", "@feathersjs/feathers": "^5.0.35", - "@feathersjs/hooks": "^0.9.0", + "@feathersjs/hooks": "^5.0.35", "@types/json-schema": "^7.0.15", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", diff --git a/packages/schema/src/default-schemas.ts b/packages/schema/src/default-schemas.ts index 810af0677..1b689913a 100644 --- a/packages/schema/src/default-schemas.ts +++ b/packages/schema/src/default-schemas.ts @@ -1,5 +1,4 @@ -import { FromSchema } from 'json-schema-to-ts' - +import type { FromSchema } from 'json-schema-to-ts' export const authenticationSettingsSchema = { type: 'object', required: ['secret', 'entity', 'authStrategies'], diff --git a/packages/schema/src/hooks/index.ts b/packages/schema/src/hooks/index.ts index 935ab7632..5a1889d2a 100644 --- a/packages/schema/src/hooks/index.ts +++ b/packages/schema/src/hooks/index.ts @@ -1,2 +1,2 @@ -export * from './resolve' -export * from './validate' +export * from './resolve.js' +export * from './validate.js' diff --git a/packages/schema/src/hooks/resolve.ts b/packages/schema/src/hooks/resolve.ts index b61bbcb11..bc469021e 100644 --- a/packages/schema/src/hooks/resolve.ts +++ b/packages/schema/src/hooks/resolve.ts @@ -1,6 +1,6 @@ -import { HookContext, NextFunction } from '@feathersjs/feathers' +import type { HookContext, NextFunction } from '@feathersjs/feathers' import { compose } from '@feathersjs/hooks' -import { Resolver, ResolverStatus } from '../resolver' +import { Resolver, ResolverStatus } from '../resolver.js' const getResult = (context: H) => { const isPaginated = context.method === 'find' && context.result.data diff --git a/packages/schema/src/hooks/validate.ts b/packages/schema/src/hooks/validate.ts index 37bcfb0a6..e50e19669 100644 --- a/packages/schema/src/hooks/validate.ts +++ b/packages/schema/src/hooks/validate.ts @@ -1,9 +1,8 @@ -import { HookContext, NextFunction } from '@feathersjs/feathers' +import type { HookContext, NextFunction } from '@feathersjs/feathers' import { BadRequest } from '@feathersjs/errors' import { VALIDATED } from '@feathersjs/adapter-commons' -import { Schema, Validator } from '../schema' -import { DataValidatorMap } from '../json-schema' - +import type { Schema, Validator } from '../schema.js' +import type { DataValidatorMap } from '../json-schema.js' export const validateQuery = (schema: Schema | Validator) => { const validator: Validator = typeof schema === 'function' ? schema : schema.validate.bind(schema) diff --git a/packages/schema/src/index.ts b/packages/schema/src/index.ts index 6e5e2ba8f..034f109a1 100644 --- a/packages/schema/src/index.ts +++ b/packages/schema/src/index.ts @@ -1,23 +1,23 @@ import addFormats, { FormatName, FormatOptions, FormatsPluginOptions } from 'ajv-formats' -import { ResolverStatus } from './resolver' - +import { ResolverStatus } from './resolver.js' +import type { HookContext } from '@feathersjs/hooks' export type { FromSchema } from 'json-schema-to-ts' export { addFormats, FormatName, FormatOptions, FormatsPluginOptions } -export * from './schema' -export * from './resolver' -export * from './hooks' -export * from './json-schema' -export * from './default-schemas' +export * from './schema.js' +export * from './resolver.js' +export * from './hooks/index.js' +export * from './json-schema.js' +export * from './default-schemas.js' -export * as hooks from './hooks' -export * as jsonSchema from './json-schema' +export * as hooks from './hooks/index.js' +export * as jsonSchema from './json-schema.js' export type Infer = S['_type'] export type Combine = Pick, Exclude, keyof U>> & U -declare module '@feathersjs/feathers/lib/declarations' { +declare module '@feathersjs/feathers' { interface Params { resolve?: ResolverStatus } diff --git a/packages/schema/src/json-schema.ts b/packages/schema/src/json-schema.ts index 0d0739b49..ea3f2945c 100644 --- a/packages/schema/src/json-schema.ts +++ b/packages/schema/src/json-schema.ts @@ -1,7 +1,7 @@ import { _ } from '@feathersjs/commons' import { JSONSchema } from 'json-schema-to-ts' -import { JSONSchemaDefinition, Ajv, Validator } from './schema' - +import type { Validator } from './schema.js' +import { JSONSchemaDefinition, Ajv } from './schema.js' export type DataSchemaMap = { create: JSONSchemaDefinition update?: JSONSchemaDefinition diff --git a/packages/schema/src/resolver.ts b/packages/schema/src/resolver.ts index 4c191ca79..ae611b645 100644 --- a/packages/schema/src/resolver.ts +++ b/packages/schema/src/resolver.ts @@ -1,6 +1,5 @@ import { BadRequest } from '@feathersjs/errors' -import { Schema } from './schema' - +import type { Schema } from './schema.js' type PromiseOrLiteral = Promise | V export type PropertyResolver = (( diff --git a/packages/schema/src/schema.ts b/packages/schema/src/schema.ts index d59396f56..d9b51fafc 100644 --- a/packages/schema/src/schema.ts +++ b/packages/schema/src/schema.ts @@ -1,5 +1,6 @@ import Ajv, { AsyncValidateFunction, ValidateFunction } from 'ajv' -import { FromSchema, JSONSchema } from 'json-schema-to-ts' +import type { FromSchema } from 'json-schema-to-ts' +import { JSONSchema } from 'json-schema-to-ts' import { BadRequest } from '@feathersjs/errors' export const DEFAULT_AJV = new Ajv({ diff --git a/packages/schema/test/fixture.ts b/packages/schema/test/fixture.ts index 4456d6aad..e05362436 100644 --- a/packages/schema/test/fixture.ts +++ b/packages/schema/test/fixture.ts @@ -1,7 +1,9 @@ -import { feathers, HookContext, Application as FeathersApplication } from '@feathersjs/feathers' +import type { HookContext, Application as FeathersApplication } from '@feathersjs/feathers' +import { feathers } from '@feathersjs/feathers' import { memory, MemoryService } from '@feathersjs/memory' import { GeneralError } from '@feathersjs/errors' -import { AdapterParams } from '@feathersjs/adapter-commons' +import type { AdapterParams } from '@feathersjs/adapter-commons' +import type { FromSchema } from '../src/index.js' import { resolve, @@ -14,13 +16,11 @@ import { resolveDispatch, resolveAll, Ajv, - FromSchema, getValidator, getDataValidator, virtual, resolveExternal -} from '../src' - +} from '../src/index.js' const fixtureAjv = new Ajv({ coerceTypes: true, addUsedSchema: false diff --git a/packages/schema/test/hooks.test.ts b/packages/schema/test/hooks.test.ts index b7a5b1c8a..60a34049f 100644 --- a/packages/schema/test/hooks.test.ts +++ b/packages/schema/test/hooks.test.ts @@ -1,6 +1,7 @@ import { createContext } from '@feathersjs/feathers' import assert from 'assert' -import { app, Message, User } from './fixture' +import { app } from './fixture.js' +import type { Message, User } from './fixture.js' describe('@feathersjs/schema/hooks', () => { const text = 'Hi there' diff --git a/packages/schema/test/json-schema.test.ts b/packages/schema/test/json-schema.test.ts index d927f8f5a..84c0b1dca 100644 --- a/packages/schema/test/json-schema.test.ts +++ b/packages/schema/test/json-schema.test.ts @@ -1,8 +1,8 @@ import Ajv from 'ajv' import assert from 'assert' import { ObjectId as MongoObjectId } from 'mongodb' -import { FromSchema } from '../src' -import { querySyntax, ObjectIdSchema } from '../src/json-schema' +import type { FromSchema } from '../src/index.js' +import { querySyntax, ObjectIdSchema } from '../src/json-schema.js' describe('@feathersjs/schema/json-schema', () => { it('querySyntax works with no properties', async () => { diff --git a/packages/schema/test/resolver.test.ts b/packages/schema/test/resolver.test.ts index 748c3e065..68e881b55 100644 --- a/packages/schema/test/resolver.test.ts +++ b/packages/schema/test/resolver.test.ts @@ -1,8 +1,9 @@ import assert from 'assert' import { BadRequest } from '@feathersjs/errors' -import { FromSchema, schema, resolve, virtual } from '../src' +import type { FromSchema } from '../src/index.js' +import { schema, resolve, virtual } from '../src/index.js' describe('@feathersjs/schema/resolver', () => { const userSchema = { $id: 'simple-user', diff --git a/packages/schema/test/schema.test.ts b/packages/schema/test/schema.test.ts index a9358dd4a..dd79f9681 100644 --- a/packages/schema/test/schema.test.ts +++ b/packages/schema/test/schema.test.ts @@ -1,7 +1,9 @@ import assert from 'assert' -import { schema, Infer, queryProperty } from '../src' -import Ajv, { AnySchemaObject } from 'ajv' +import type { Infer } from '../src/index.js' + +import { schema, queryProperty } from '../src/index.js' +import Ajv, { type AnySchemaObject } from 'ajv' import addFormats from 'ajv-formats' const customAjv = new Ajv({ diff --git a/packages/socketio-client/LICENSE b/packages/socketio-client/LICENSE index 7712f870f..f9b502c69 100644 --- a/packages/socketio-client/LICENSE +++ b/packages/socketio-client/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2024 Feathers Contributors +Copyright (c) 2025 Feathers Contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -19,4 +19,3 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - diff --git a/packages/socketio-client/README.md b/packages/socketio-client/README.md index 7bb103c6b..c0e42a2b3 100644 --- a/packages/socketio-client/README.md +++ b/packages/socketio-client/README.md @@ -18,6 +18,6 @@ Refer to the [Feathers SocketIO API documentation](https://feathersjs.com/api/cl ## License -Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) +Copyright (c) 2025 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) Licensed under the [MIT license](LICENSE). diff --git a/packages/socketio-client/package.json b/packages/socketio-client/package.json index eb7a320c8..8f2221563 100644 --- a/packages/socketio-client/package.json +++ b/packages/socketio-client/package.json @@ -3,8 +3,8 @@ "description": "The client for Socket.io through feathers-socketio", "version": "5.0.35", "homepage": "https://feathersjs.com", - "main": "lib/", - "types": "lib/", + "main": "lib/index.js", + "type": "module", "keywords": [ "feathers", "feathers-plugin" @@ -29,7 +29,7 @@ "url": "https://github.com/feathersjs/feathers/issues" }, "engines": { - "node": ">= 12" + "node": ">= 20" }, "scripts": { "prepublish": "npm run compile", diff --git a/packages/socketio-client/src/index.ts b/packages/socketio-client/src/index.ts index af4000a1e..8c3338239 100644 --- a/packages/socketio-client/src/index.ts +++ b/packages/socketio-client/src/index.ts @@ -1,15 +1,11 @@ -import { Service, SocketService } from '@feathersjs/transport-commons/client' +import type { SocketService } from '@feathersjs/transport-commons/client.js' +import { Service } from '@feathersjs/transport-commons/client.js' import { Socket } from 'socket.io-client' -import { - Application, - TransportConnection, - defaultEventMap, - defaultServiceMethods -} from '@feathersjs/feathers' - +import type { Application, TransportConnection } from '@feathersjs/feathers' +import { defaultEventMap, defaultServiceMethods } from '@feathersjs/feathers' export { SocketService } -declare module '@feathersjs/feathers/lib/declarations' { +declare module '@feathersjs/feathers' { // eslint-disable-next-line @typescript-eslint/no-unused-vars interface FeathersApplication { /** diff --git a/packages/socketio-client/test/index.test.ts b/packages/socketio-client/test/index.test.ts index a39f8f84e..a8a65105b 100644 --- a/packages/socketio-client/test/index.test.ts +++ b/packages/socketio-client/test/index.test.ts @@ -1,12 +1,13 @@ /* eslint-disable @typescript-eslint/ban-ts-comment */ import { strict as assert } from 'assert' import { Server } from 'http' -import { CustomMethod, feathers } from '@feathersjs/feathers' +import type { CustomMethod } from '@feathersjs/feathers' +import { feathers } from '@feathersjs/feathers' import { io, Socket } from 'socket.io-client' import { clientTests } from '@feathersjs/tests' -import { createServer } from './server' -import socketio, { SocketService } from '../src' +import { createServer } from './server.js' +import socketio, { type SocketService } from '../src/index.js' type ServiceTypes = { '/': SocketService diff --git a/packages/socketio-client/test/server.ts b/packages/socketio-client/test/server.ts index 8d579a799..d6c2507bf 100644 --- a/packages/socketio-client/test/server.ts +++ b/packages/socketio-client/test/server.ts @@ -1,4 +1,5 @@ -import { feathers, Id, Params } from '@feathersjs/feathers' +import type { Id, Params } from '@feathersjs/feathers' +import { feathers } from '@feathersjs/feathers' import socketio from '@feathersjs/socketio' import '@feathersjs/transport-commons' import { MemoryService } from '@feathersjs/memory' diff --git a/packages/socketio/LICENSE b/packages/socketio/LICENSE index 7712f870f..f9b502c69 100644 --- a/packages/socketio/LICENSE +++ b/packages/socketio/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2024 Feathers Contributors +Copyright (c) 2025 Feathers Contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -19,4 +19,3 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - diff --git a/packages/socketio/README.md b/packages/socketio/README.md index 2ba5ebaee..c1ee28796 100644 --- a/packages/socketio/README.md +++ b/packages/socketio/README.md @@ -18,6 +18,6 @@ Refer to the [Feathers SocketIO API documentation](https://feathersjs.com/api/so ## License -Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) +Copyright (c) 2025 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) Licensed under the [MIT license](LICENSE). diff --git a/packages/socketio/package.json b/packages/socketio/package.json index 09fa914d4..b965e043d 100644 --- a/packages/socketio/package.json +++ b/packages/socketio/package.json @@ -3,8 +3,8 @@ "description": "The Feathers Socket.io real-time API provider", "version": "5.0.35", "homepage": "https://feathersjs.com", - "main": "lib/", - "types": "lib/", + "main": "lib/index.js", + "type": "module", "keywords": [ "feathers", "feathers-plugin" @@ -29,7 +29,7 @@ "url": "https://github.com/feathersjs/feathers/issues" }, "engines": { - "node": ">= 12" + "node": ">= 20" }, "files": [ "CHANGELOG.md", @@ -64,7 +64,7 @@ "@feathersjs/tests": "^5.0.35", "@types/mocha": "^10.0.10", "@types/node": "^24.3.1", - "lodash": "^4.17.21", + "lodash-es": "^4.17.21", "mocha": "^11.7.2", "shx": "^0.4.0", "socket.io-client": "^4.8.1", diff --git a/packages/socketio/src/index.ts b/packages/socketio/src/index.ts index d502cade9..510c431c5 100644 --- a/packages/socketio/src/index.ts +++ b/packages/socketio/src/index.ts @@ -1,14 +1,14 @@ import http from 'http' import { Server, ServerOptions } from 'socket.io' import { createDebug } from '@feathersjs/commons' -import { Application, RealTimeConnection } from '@feathersjs/feathers' +import type { Application, RealTimeConnection } from '@feathersjs/feathers' import { socket } from '@feathersjs/transport-commons' -import { disconnect, params, authentication, FeathersSocket } from './middleware' +import { disconnect, params, authentication, FeathersSocket } from './middleware.js' const debug = createDebug('@feathersjs/socketio') -declare module '@feathersjs/feathers/lib/declarations' { +declare module '@feathersjs/feathers' { // eslint-disable-next-line @typescript-eslint/no-unused-vars interface Application { io: any @@ -16,17 +16,17 @@ declare module '@feathersjs/feathers/lib/declarations' { } } -function configureSocketio(callback?: (io: Server) => void): (app: Application) => void -function configureSocketio( +export default function configureSocketio(callback?: (io: Server) => void): (app: Application) => void +export default function configureSocketio( options: number | Partial, callback?: (io: Server) => void ): (app: Application) => void -function configureSocketio( +export default function configureSocketio( port: number, options?: Partial, callback?: (io: Server) => void ): (app: Application) => void -function configureSocketio(port?: any, options?: any, config?: any) { +export default function configureSocketio(port?: any, options?: any, config?: any) { if (typeof port !== 'number') { config = options options = port @@ -99,5 +99,3 @@ function configureSocketio(port?: any, options?: any, config?: any) { ) } } - -export = configureSocketio diff --git a/packages/socketio/src/middleware.ts b/packages/socketio/src/middleware.ts index a16fdc833..04adef58f 100644 --- a/packages/socketio/src/middleware.ts +++ b/packages/socketio/src/middleware.ts @@ -1,4 +1,4 @@ -import { Application, Params, RealTimeConnection } from '@feathersjs/feathers' +import type { Application, Params, RealTimeConnection } from '@feathersjs/feathers' import { createDebug } from '@feathersjs/commons' import { Socket } from 'socket.io' diff --git a/packages/socketio/test/events.ts b/packages/socketio/test/events.ts index 52b94e894..f896da09a 100644 --- a/packages/socketio/test/events.ts +++ b/packages/socketio/test/events.ts @@ -1,8 +1,7 @@ import { strict as assert } from 'assert' import { io, Socket } from 'socket.io-client' import { verify } from '@feathersjs/tests' -import { RealTimeConnection } from '@feathersjs/feathers' - +import type { RealTimeConnection } from '@feathersjs/feathers' export default (name: string, options: any) => { const call = (method: string, ...args: any[]) => { return new Promise((resolve, reject) => { diff --git a/packages/socketio/test/index.test.ts b/packages/socketio/test/index.test.ts index cff9b4fae..cd12e695e 100644 --- a/packages/socketio/test/index.test.ts +++ b/packages/socketio/test/index.test.ts @@ -1,26 +1,26 @@ import { strict as assert } from 'assert' -import { - feathers, +import type { Application, HookContext, NullableId, Params, ApplicationHookContext } from '@feathersjs/feathers' +import { feathers } from '@feathersjs/feathers' import express from '@feathersjs/express' -import { Request, Response } from 'express' -import omit from 'lodash/omit' -import extend from 'lodash/extend' +import type { Request, Response } from 'express' +import { omit } from 'lodash-es' +import { extend } from 'lodash-es' import { io } from 'socket.io-client' import axios from 'axios' import { Server } from 'http' import { Service } from '@feathersjs/tests' import { Socket } from 'socket.io-client' -import methodTests from './methods' -import eventTests from './events' -import socketio from '../src' -import { FeathersSocket, NextFunction } from '../src/middleware.js' +import methodTests from './methods.js' +import eventTests from './events.js' +import socketio from '../src/index.js' +import type { NextFunction, FeathersSocket } from '../src/middleware.js' class VerifierService { async find(params: Params) { diff --git a/packages/tests/LICENSE b/packages/tests/LICENSE index 7712f870f..f9b502c69 100644 --- a/packages/tests/LICENSE +++ b/packages/tests/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2024 Feathers Contributors +Copyright (c) 2025 Feathers Contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -19,4 +19,3 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - diff --git a/packages/tests/package.json b/packages/tests/package.json index e46a80b5e..f33e40b7a 100644 --- a/packages/tests/package.json +++ b/packages/tests/package.json @@ -4,8 +4,8 @@ "description": "Feathers core module common tests", "version": "5.0.35", "homepage": "https://feathersjs.com", - "main": "lib/", - "types": "lib/", + "main": "lib/index.js", + "type": "module", "keywords": [ "feathers" ], @@ -29,7 +29,7 @@ "url": "https://github.com/feathersjs/feathers/issues" }, "engines": { - "node": ">= 12" + "node": ">= 20" }, "scripts": { "prepublish": "npm run compile", @@ -46,7 +46,7 @@ "dependencies": { "@types/lodash": "^4.17.20", "axios": "^1.11.0", - "lodash": "^4.17.21" + "lodash-es": "^4.17.21" }, "devDependencies": { "@feathersjs/feathers": "^5.0.35", diff --git a/packages/tests/resources/certificate.pem b/packages/tests/resources/certificate.pem index 673564507..604a32fd7 100644 --- a/packages/tests/resources/certificate.pem +++ b/packages/tests/resources/certificate.pem @@ -1,16 +1,24 @@ -----BEGIN CERTIFICATE----- -MIICmzCCAgQCCQDugFqITnU/sDANBgkqhkiG9w0BAQUFADCBkTELMAkGA1UEBhMC -Q0ExEDAOBgNVBAgTB0FsYmVydGExEDAOBgNVBAcTB0NhbGdhcnkxETAPBgNVBAoT -CEZlYXRoZXJzMREwDwYDVQQLEwhGZWF0aGVyczETMBEGA1UEAxMKRmVhdGhlcnNK -UzEjMCEGCSqGSIb3DQEJARYUaGVsbG9AZmVhdGhlcnNqcy5jb20wHhcNMTQwMTA0 -MDIwNTUyWhcNMTQwMjAzMDIwNTUyWjCBkTELMAkGA1UEBhMCQ0ExEDAOBgNVBAgT -B0FsYmVydGExEDAOBgNVBAcTB0NhbGdhcnkxETAPBgNVBAoTCEZlYXRoZXJzMREw -DwYDVQQLEwhGZWF0aGVyczETMBEGA1UEAxMKRmVhdGhlcnNKUzEjMCEGCSqGSIb3 -DQEJARYUaGVsbG9AZmVhdGhlcnNqcy5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0A -MIGJAoGBALixfLwrvDDYAaaU62oycz8zwUpxCguyyXyhVDN/KMmP/I+HfkbcIrqj -tW0jbpRWiLhn5cw4K/cUTkfMj4AwaN5t2zq0FVFJdIddLxzuamyJLJFZfs5sPYWt -X6morPcu9RM7jwb3R1V852XjVWUj8neUAu7eUzKoSQ575kHsnKrdAgMBAAEwDQYJ -KoZIhvcNAQEFBQADgYEATVlxNPkSgkqBF4foUYNGnkvaiwhd88Mh/Ya3T3EnknF9 -Gz6KrlwWDDI8MkPmqabT2Ijg3LSec7WV+C8SETVFbWLOGV6N1ZVfodFzJ7EKMz5e -VvEIKnHfHpYOEa21E5u02+OfKahtW37eTEVmvcV67vYmW4HNa5QSZ5qfrrqcUhc= +MIIEBTCCAu2gAwIBAgIUJ8EvIWhR0b73puQ0v0belOlcwaowDQYJKoZIhvcNAQEL +BQAwgZExCzAJBgNVBAYTAkNBMRAwDgYDVQQIDAdBbGJlcnRhMRAwDgYDVQQHDAdD +YWxnYXJ5MREwDwYDVQQKDAhGZWF0aGVyczERMA8GA1UECwwIRmVhdGhlcnMxEzAR +BgNVBAMMCkZlYXRoZXJzSlMxIzAhBgkqhkiG9w0BCQEWFGhlbGxvQGZlYXRoZXJz +anMuY29tMB4XDTI1MTAwMzIwNTYzNloXDTM1MTAwMTIwNTYzNlowgZExCzAJBgNV +BAYTAkNBMRAwDgYDVQQIDAdBbGJlcnRhMRAwDgYDVQQHDAdDYWxnYXJ5MREwDwYD +VQQKDAhGZWF0aGVyczERMA8GA1UECwwIRmVhdGhlcnMxEzARBgNVBAMMCkZlYXRo +ZXJzSlMxIzAhBgkqhkiG9w0BCQEWFGhlbGxvQGZlYXRoZXJzanMuY29tMIIBIjAN +BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtYif0YoYPXHMC9Zb6WPISZTyrf6t +p+vhxEp10xD8raAUCTPPzfIx2I7K5bsmR6R6gjtkKZBFkNDRl2EqQyR5kLawsGce +Ca9T+gB0t7vb5EZv+xWtCsk7FmMpSZF/TbRWoG2E0CoL1dXXZYap42GDvM0cI+nN +a0ETu751KTFK3lyE698mLobATnL2sm4zFSXdYWflLNfqJTkM0A7t1FV9hWNwkHNq +Ir/uFhRrP+BBGs77dZyxiKxUMgXE/BRyxci678h0ZjlhbH/Y8GSxvhlly2GG/QAE +ilc9DLsfBHlMME05V/bVPOVRkdQWFt9uOY8YIsVo1IyyzOPU/hFnJk9LsQIDAQAB +o1MwUTAdBgNVHQ4EFgQU0i/qz+Mb36SlfCVacH9Br1nyteQwHwYDVR0jBBgwFoAU +0i/qz+Mb36SlfCVacH9Br1nyteQwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0B +AQsFAAOCAQEALF5OApPxTNFeqMalz6qkQdugagWdCxIlgDyVnknhpOwhRnIC4Hlz +o+4lXWGyNeYPOFYnsdXC6s68rFVQAdOq/AgJRMMuYJBJ3LkCNB+k4KNU0AeAxBRx +DL+xMf1Cjugl0ixMRyoGCMyNswOnbZsWJ1ATsRuIvolLetuTaEIlaCRMklLbn371 +dZzmTiv/lmXUlsWqm5+iUCLZJTEHzAizFPk0axTRy7gkwDAVXVzsfEd/FHbMoTTL ++J/eTTTOkmLEkPt2ry5RE7iUSc3rI6n5WsJkmVlfgDtB7R3qs7h+XrZptvjCgVjF +iJbt+KsYolWUbuf5Ag07Ukl+iHH4dOm+Yg== -----END CERTIFICATE----- diff --git a/packages/tests/resources/privatekey.pem b/packages/tests/resources/privatekey.pem index 3a39a2392..376056be6 100644 --- a/packages/tests/resources/privatekey.pem +++ b/packages/tests/resources/privatekey.pem @@ -1,15 +1,28 @@ ------BEGIN RSA PRIVATE KEY----- -MIICXAIBAAKBgQC4sXy8K7ww2AGmlOtqMnM/M8FKcQoLssl8oVQzfyjJj/yPh35G -3CK6o7VtI26UVoi4Z+XMOCv3FE5HzI+AMGjebds6tBVRSXSHXS8c7mpsiSyRWX7O -bD2FrV+pqKz3LvUTO48G90dVfOdl41VlI/J3lALu3lMyqEkOe+ZB7Jyq3QIDAQAB -AoGAYCTkzf/mY3bOxSzYr9u7ardCc8IMfLKBeMNy1avoS6UM0Jqz/acy3P3DwCCl -u8qgOX68fWbwXBrR9UZjnVOWAvAgACS9bSTR4UxXuHve9YHf1s1Idm1Ck8CopiuY -0PTiuF7OJp6U7fc1RjO5F5tvSMuYbh+68Vpx9SQRfDHYqnECQQD1KnhSRDjLCfoB -lLfTew99W51OTx2NPRKRXwZH/YwlgRl/cAgJhdemah/AAavB6BUdqEXdiIviEHuT -UsfAXhf7AkEAwNrmEI3B4gtMRKJAsyWAKGFxDHuC9wGkhSxCVihQuxXtqEMX7Qnx -ucU9bRRtUgVPcOmFEtpPsI4e0wkTMg+ZBwJAPL+ERuYuqGjVcPTXw+g3Q1mjFddW -vDuI0UqZdNcnlddyaPhqlWl7sPmU2m/PjmGicdHTVfxSpPZumGenpUvrZwJAdodS -9QObEOmus1Qhfbljne3dhDV5FYTd77d3Aer/Syy8BzlNQDNnbKysBxmR4uI+o//x -+NdSOQnwKfYe5RqvCwJBAMfq911uzlD8Kd9s0n+MJe8b5/duYOtgPZvaIFWOWyNm -0aJE/VovVhk2JGvIU9kxdgt9O4N0x2XukS2hq7I1Xts= ------END RSA PRIVATE KEY----- +-----BEGIN PRIVATE KEY----- +MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC1iJ/Rihg9ccwL +1lvpY8hJlPKt/q2n6+HESnXTEPytoBQJM8/N8jHYjsrluyZHpHqCO2QpkEWQ0NGX +YSpDJHmQtrCwZx4Jr1P6AHS3u9vkRm/7Fa0KyTsWYylJkX9NtFagbYTQKgvV1ddl +hqnjYYO8zRwj6c1rQRO7vnUpMUreXITr3yYuhsBOcvaybjMVJd1hZ+Us1+olOQzQ +Du3UVX2FY3CQc2oiv+4WFGs/4EEazvt1nLGIrFQyBcT8FHLFyLrvyHRmOWFsf9jw +ZLG+GWXLYYb9AASKVz0Mux8EeUwwTTlX9tU85VGR1BYW3245jxgixWjUjLLM49T+ +EWcmT0uxAgMBAAECggEABKrmub90Uu91iLq3ghypxkiROoDmoVTFk+OP5tV+5bj3 +Yuraiuf8DkknoDi2adepuxEAs4032LAh1M5aWj/FF2qMcvtdG0XPNzRNS/nFfuJX +wpaNVzkS2ZxtmpcQ3/mFKQVVNE6sdLsARDuY69WH9Vy3E+5Q9OhyCTJYYVmDhwxC +BHwmiAA5TU/B80ih8ZMABZtHODyUX+u8DpRZJshdLHYsa9H16QvuFa17mdJnMVCI +NmxJEVZ12y5IxYEo+etUugXCBEKRvaWeK5WNCW0pIWXlVjw+XUcfYwEeYAknInFq +VFgPSg/xhiJMRsLyc5iwStnKNmn6IJC17FGE5whaRQKBgQDg5PRrO634hBw2QksM +lHCKnNRBvaG6hJw6lzRbKdvd5J7K/Xn6KihImtc+Q3seBEIjEXIAt7GmkvWirPLA +oy/nr+0iPn3axZ8uWCZ6671VKnFea/ru9r07/U7KiqxAOsMEVDS7uVOKJap2BbVL +MNy73dlp2ENsdeFl15FL+3ovPQKBgQDOpFuXt8YjAEZHc6gpMXosYP9TjAGECEHF +6B8+hQYuw6uCSpbUrl13R+4SMFbAww+Eza0njKX6W61hOVQi+au62bEoJXDOUC1m +2Fhz7D6vU6tkHMM2FZ9yxEWe+3yhEWWt5FcJyMJxqfIWGdDDGguK3Xawx0Mg3AqN +ExAx+RPVhQKBgFbwS4iUxpk2wQ08rXSMgcEkBW3wl+/Zyedggo3nbaam9bf1K01J +NM90hFb+kT62WLbjzJV4bcW+NBUSFLnhm+hN+zbsv4xuLy4kR6PnNAcTZEYjKhts +6RSixO3Jk/M0hCVNRCF58FCMZQxBAqexmPNLPPwM7WulWmAbaIDeE4rlAoGACYm6 +lJEt+xWbKNckzunyurOrdV7D/yUmbA0fzBH1zBjKBNSOi7iUpdnTGlHS30jhoX6g +3G94hcrPgOpVgNvHWnOL4s9/mnZG8jVQN+GSryMMiS1usUNkPbbjg8gV45Va/SDK +B7CVkQuIGg8M/MRp/fnk7Zn09kJR1lsn5zaY/MUCgYBeeLsUyFK5qYhxGNlHbxbn +CEvHGmotCQvpgTooUVEAr/tCRwOSDYYNLXP0jGqQ0AwU9EAkcKSocPU/uuyKKo+C +xx/NWGZxc4GCpotj7qzkQN5QIcumcL+11aBT+X2/cTkz++fPrTo23Jy0VhuPs4DF +Y4Gv7YosjZigIzifrFVPjg== +-----END PRIVATE KEY----- diff --git a/packages/tests/src/index.ts b/packages/tests/src/index.ts index 214319e14..de0fb7764 100644 --- a/packages/tests/src/index.ts +++ b/packages/tests/src/index.ts @@ -1,3 +1,3 @@ -export * from './client' -export * from './rest' -export * from './fixture' +export * from './client.js' +export * from './rest.js' +export * from './fixture.js' diff --git a/packages/tests/src/rest.ts b/packages/tests/src/rest.ts index 78149ba36..91dd2e782 100644 --- a/packages/tests/src/rest.ts +++ b/packages/tests/src/rest.ts @@ -1,7 +1,7 @@ import assert from 'assert' import axios from 'axios' -import { verify } from './fixture' +import { verify } from './fixture.js' export function restTests(description: string, name: string, port: number) { describe(description, () => { diff --git a/packages/transport-commons/LICENSE b/packages/transport-commons/LICENSE index 7712f870f..f9b502c69 100644 --- a/packages/transport-commons/LICENSE +++ b/packages/transport-commons/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2024 Feathers Contributors +Copyright (c) 2025 Feathers Contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -19,4 +19,3 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - diff --git a/packages/transport-commons/README.md b/packages/transport-commons/README.md index bce17ee0b..452c6d065 100644 --- a/packages/transport-commons/README.md +++ b/packages/transport-commons/README.md @@ -8,6 +8,6 @@ ## License -Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) +Copyright (c) 2025 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) Licensed under the [MIT license](LICENSE). diff --git a/packages/transport-commons/client.d.ts b/packages/transport-commons/client.d.ts index ee328040c..d85c7e5fc 100644 --- a/packages/transport-commons/client.d.ts +++ b/packages/transport-commons/client.d.ts @@ -1 +1 @@ -export * from './lib/client' +export * from './lib/client.js' diff --git a/packages/transport-commons/client.js b/packages/transport-commons/client.js index 19d52462d..d85c7e5fc 100644 --- a/packages/transport-commons/client.js +++ b/packages/transport-commons/client.js @@ -1 +1 @@ -module.exports = require('./lib/client'); \ No newline at end of file +export * from './lib/client.js' diff --git a/packages/transport-commons/package.json b/packages/transport-commons/package.json index 8d572f8f1..a332d9fed 100644 --- a/packages/transport-commons/package.json +++ b/packages/transport-commons/package.json @@ -3,8 +3,8 @@ "description": "Shared functionality for websocket providers", "version": "5.0.35", "homepage": "https://feathersjs.com", - "main": "lib/", - "types": "lib/", + "main": "lib/index.js", + "type": "module", "keywords": [ "feathers", "feathers-plugin" @@ -29,7 +29,7 @@ "url": "https://github.com/feathersjs/feathers/issues" }, "engines": { - "node": ">= 12" + "node": ">= 20" }, "scripts": { "prepublish": "npm run compile", @@ -58,7 +58,7 @@ "@feathersjs/errors": "^5.0.35", "@feathersjs/feathers": "^5.0.35", "encodeurl": "^2.0.0", - "lodash": "^4.17.21" + "lodash-es": "^4.17.21" }, "devDependencies": { "@types/encodeurl": "^1.0.3", diff --git a/packages/transport-commons/src/channels/channel/base.ts b/packages/transport-commons/src/channels/channel/base.ts deleted file mode 100644 index 471739388..000000000 --- a/packages/transport-commons/src/channels/channel/base.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { EventEmitter } from 'events' -import { RealTimeConnection } from '@feathersjs/feathers' - -export class Channel extends EventEmitter { - connections: RealTimeConnection[] - data: any - - constructor(connections: RealTimeConnection[] = [], data: any = null) { - super() - - this.connections = connections - this.data = data - } - - get length() { - return this.connections.length - } - - leave(...connections: RealTimeConnection[]) { - connections.forEach((current) => { - if (typeof current === 'function') { - const callback = current as (connection: RealTimeConnection) => boolean - - this.leave(...this.connections.filter(callback)) - } else { - const index = this.connections.indexOf(current) - - if (index !== -1) { - this.connections.splice(index, 1) - } - } - }) - - if (this.length === 0) { - this.emit('empty') - } - - return this - } - - join(...connections: RealTimeConnection[]) { - connections.forEach((connection) => { - if (connection && this.connections.indexOf(connection) === -1) { - this.connections.push(connection) - } - }) - - return this - } - - filter(fn: (connection: RealTimeConnection) => boolean) { - return new Channel(this.connections.filter(fn), this.data) - } - - send(data: any) { - return new Channel(this.connections, data) - } -} diff --git a/packages/transport-commons/src/channels/channel/combined.ts b/packages/transport-commons/src/channels/channel/combined.ts deleted file mode 100644 index c6723f61d..000000000 --- a/packages/transport-commons/src/channels/channel/combined.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { RealTimeConnection } from '@feathersjs/feathers' -import { Channel } from './base' - -function collectConnections(children: Channel[]) { - const mappings = new WeakMap() - const connections: RealTimeConnection[] = [] - - children.forEach((channel) => { - channel.connections.forEach((connection) => { - if (!mappings.has(connection)) { - connections.push(connection) - mappings.set(connection, channel.data) - } - }) - }) - - return { connections, mappings } -} - -export class CombinedChannel extends Channel { - children: Channel[] - mappings: WeakMap - - constructor(children: Channel[], data: any = null) { - const { mappings, connections } = collectConnections(children) - - super(connections, data) - - this.children = children - this.mappings = mappings - } - - refresh() { - const collected = collectConnections(this.children) - - return Object.assign(this, collected) - } - - leave(...connections: RealTimeConnection[]) { - return this.callChildren('leave', connections) - } - - join(...connections: RealTimeConnection[]) { - return this.callChildren('join', connections) - } - - dataFor(connection: RealTimeConnection) { - return this.mappings.get(connection) - } - - private callChildren(method: string, connections: RealTimeConnection[]) { - this.children.forEach((child: any) => child[method](...connections)) - this.refresh() - - return this - } -} diff --git a/packages/transport-commons/src/channels/index.ts b/packages/transport-commons/src/channels/index.ts deleted file mode 100644 index 2c7a5fc70..000000000 --- a/packages/transport-commons/src/channels/index.ts +++ /dev/null @@ -1,120 +0,0 @@ -import { Application, FeathersService, RealTimeConnection, getServiceOptions } from '@feathersjs/feathers' -import { createDebug } from '@feathersjs/commons' -import flattenDeep from 'lodash/flattenDeep' -import { Channel } from './channel/base' -import { CombinedChannel } from './channel/combined' -import { channelMixin, publishMixin, keys, PublishMixin, Event, Publisher } from './mixins' -import EventEmitter from 'events' - -const debug = createDebug('@feathersjs/transport-commons/channels') -const { CHANNELS } = keys - -declare module '@feathersjs/feathers/lib/declarations' { - interface ServiceAddons extends EventEmitter { - // eslint-disable-line - publish(publisher: Publisher, A, this>): this - publish(event: Event, publisher: Publisher, A, this>): this - - registerPublisher(publisher: Publisher, A, this>): this - registerPublisher(event: Event, publisher: Publisher, A, this>): this - } - - // eslint-disable-next-line @typescript-eslint/no-unused-vars - interface Application { - // eslint-disable-line - channels: string[] - - channel(name: string | string[]): Channel - channel(...names: string[]): Channel - - publish(publisher: Publisher): this - publish(event: Event, publisher: Publisher): this - - registerPublisher(publisher: Publisher): this - registerPublisher(event: Event, publisher: Publisher): this - } - - interface Params { - connection?: RealTimeConnection - } -} - -export { keys } - -export function channels() { - return (app: Application) => { - if (typeof app.channel === 'function' && typeof app.publish === 'function') { - return - } - - Object.assign(app, channelMixin(), publishMixin()) - Object.defineProperty(app, 'channels', { - get() { - return Object.keys(this[CHANNELS]) - } - }) - - app.mixins.push((service: FeathersService, path: string) => { - const { serviceEvents } = getServiceOptions(service) - - if (typeof service.publish === 'function') { - return - } - - Object.assign(service, publishMixin()) - - serviceEvents.forEach((event: string) => { - service.on(event, function (data, hook) { - if (!hook) { - // Fake hook for custom events - hook = { path, service, app, result: data } - } - - debug('Publishing event', event, hook.path) - - const logError = (error: any) => debug(`Error in '${hook.path} ${event}' publisher`, error) - const servicePublishers = (service as unknown as PublishMixin)[keys.PUBLISHERS] - const appPublishers = (app as unknown as PublishMixin)[keys.PUBLISHERS] - // This will return the first publisher list that is not empty - // In the following precedence - const publisher = - // 1. Service publisher for a specific event - servicePublishers[event] || - // 2. Service publisher for all events - servicePublishers[keys.ALL_EVENTS] || - // 3. App publisher for a specific event - appPublishers[event] || - // 4. App publisher for all events - appPublishers[keys.ALL_EVENTS] || - // 5. No publisher - (() => {}) - - try { - Promise.resolve(publisher(data, hook)) - .then((result: any) => { - if (!result) { - return - } - - const results = Array.isArray(result) - ? flattenDeep(result).filter(Boolean) - : ([result] as Channel[]) - const channel = new CombinedChannel(results) - - if (channel && channel.length > 0) { - app.emit('publish', event, channel, hook, data) - } else { - debug('No connections to publish to') - } - }) - .catch(logError) - } catch (error: any) { - logError(error) - } - }) - }) - }) - } -} - -export { Channel, CombinedChannel, RealTimeConnection } diff --git a/packages/transport-commons/src/channels/mixins.ts b/packages/transport-commons/src/channels/mixins.ts deleted file mode 100644 index 16188c99f..000000000 --- a/packages/transport-commons/src/channels/mixins.ts +++ /dev/null @@ -1,108 +0,0 @@ -/* eslint-disable @typescript-eslint/no-unnecessary-type-assertion */ -import { Application, HookContext, getServiceOptions, defaultServiceEvents } from '@feathersjs/feathers' -import { createDebug } from '@feathersjs/commons' -import { Channel } from './channel/base' -import { CombinedChannel } from './channel/combined' - -const debug = createDebug('@feathersjs/transport-commons/channels/mixins') -const PUBLISHERS = Symbol.for('@feathersjs/transport-commons/publishers') -const CHANNELS = Symbol.for('@feathersjs/transport-commons/channels') -const ALL_EVENTS = Symbol.for('@feathersjs/transport-commons/all-events') - -export const keys = { - PUBLISHERS: PUBLISHERS as typeof PUBLISHERS, - CHANNELS: CHANNELS as typeof CHANNELS, - ALL_EVENTS: ALL_EVENTS as typeof ALL_EVENTS -} - -export interface ChannelMixin { - [CHANNELS]: { [key: string]: Channel } - channel(...names: string[]): Channel -} - -export function channelMixin() { - const mixin: ChannelMixin = { - [CHANNELS]: {}, - - channel(...names: string[]): Channel { - debug('Returning channels', names) - - if (names.length === 0) { - throw new Error('app.channel needs at least one channel name') - } - - if (names.length === 1) { - const [name] = names - - if (Array.isArray(name)) { - return this.channel(...name) - } - - if (!this[CHANNELS][name]) { - const channel = new Channel() - - channel.once('empty', () => { - channel.removeAllListeners() - delete this[CHANNELS][name] - }) - - this[CHANNELS][name] = channel - } - - return this[CHANNELS][name] - } - - const channels = names.map((name) => this.channel(name)) - - return new CombinedChannel(channels) - } - } - - return mixin -} - -export type Event = string | typeof ALL_EVENTS - -export type Publisher = ( - data: T, - context: HookContext -) => Channel | Channel[] | void | Promise - -export interface PublishMixin { - [PUBLISHERS]: { [ALL_EVENTS]?: Publisher; [key: string]: Publisher } - publish(event: Event, publisher: Publisher): this - registerPublisher(event: Event, publisher: Publisher): this -} - -export function publishMixin() { - const result: PublishMixin = { - [PUBLISHERS]: {}, - - publish(...args) { - return this.registerPublisher(...args) - }, - - registerPublisher(event, publisher) { - debug('Registering publisher', event) - - if (!publisher && typeof event === 'function') { - publisher = event - event = ALL_EVENTS - } - - const { serviceEvents = defaultServiceEvents } = getServiceOptions(this) || {} - - if (event !== ALL_EVENTS && !serviceEvents.includes(event)) { - throw new Error(`'${event.toString()}' is not a valid service event`) - } - - const publishers = this[PUBLISHERS] - - publishers[event] = publisher - - return this - } - } - - return result -} diff --git a/packages/transport-commons/src/client.ts b/packages/transport-commons/src/client.ts index ad075f304..2daf78e96 100644 --- a/packages/transport-commons/src/client.ts +++ b/packages/transport-commons/src/client.ts @@ -1,8 +1,7 @@ /* eslint-disable @typescript-eslint/ban-ts-comment */ import { convert } from '@feathersjs/errors' import { createDebug } from '@feathersjs/commons' -import { Id, NullableId, Params, ServiceInterface } from '@feathersjs/feathers' - +import type { Id, NullableId, Params, ServiceInterface } from '@feathersjs/feathers' const debug = createDebug('@feathersjs/transport-commons/client') const namespacedEmitterMethods = [ diff --git a/packages/transport-commons/src/http.ts b/packages/transport-commons/src/http.ts deleted file mode 100644 index f7114b238..000000000 --- a/packages/transport-commons/src/http.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { MethodNotAllowed } from '@feathersjs/errors/lib' -import { HookContext, NullableId, Params } from '@feathersjs/feathers' -import encodeUrl from 'encodeurl' - -export const METHOD_HEADER = 'x-service-method' - -export interface ServiceParams { - id: NullableId - data: any - params: Params -} - -export const statusCodes = { - created: 201, - noContent: 204, - methodNotAllowed: 405, - success: 200, - seeOther: 303 -} - -export const knownMethods: { [key: string]: string } = { - post: 'create', - patch: 'patch', - put: 'update', - delete: 'remove' -} - -export function getServiceMethod(_httpMethod: string, id: unknown, headerOverride?: string) { - const httpMethod = _httpMethod.toLowerCase() - - if (httpMethod === 'post' && headerOverride) { - return headerOverride - } - - const mappedMethod = knownMethods[httpMethod] - - if (mappedMethod) { - return mappedMethod - } - - if (httpMethod === 'get') { - return id === null ? 'find' : 'get' - } - - throw new MethodNotAllowed(`Method ${_httpMethod} not allowed`) -} - -export const argumentsFor = { - get: ({ id, params }: ServiceParams) => [id, params], - find: ({ params }: ServiceParams) => [params], - create: ({ data, params }: ServiceParams) => [data, params], - update: ({ id, data, params }: ServiceParams) => [id, data, params], - patch: ({ id, data, params }: ServiceParams) => [id, data, params], - remove: ({ id, params }: ServiceParams) => [id, params], - default: ({ data, params }: ServiceParams) => [data, params] -} - -export function getStatusCode(context: HookContext, body: any, location: string | string[]) { - const { http = {} } = context - - if (http.status) { - return http.status - } - - if (location !== undefined) { - return statusCodes.seeOther - } - - if (!body) { - return statusCodes.noContent - } - - if (context.method === 'create') { - return statusCodes.created - } - - return statusCodes.success -} - -export function getResponse(context: HookContext) { - const { http = {} } = context - const body = context.dispatch !== undefined ? context.dispatch : context.result - - let headers = http.headers || {} - let location = headers.Location - - if (http.location !== undefined) { - location = encodeUrl(http.location) - headers = { ...headers, Location: location } - } - - const status = getStatusCode(context, body, location) - - return { status, headers, body } -} diff --git a/packages/transport-commons/src/index.ts b/packages/transport-commons/src/index.ts index bc3d1c18c..67d3454f1 100644 --- a/packages/transport-commons/src/index.ts +++ b/packages/transport-commons/src/index.ts @@ -1,7 +1,3 @@ -import { socket } from './socket' -import { routing } from './routing' -import { channels, Channel, CombinedChannel } from './channels' -import { RealTimeConnection } from '@feathersjs/feathers' - -export * as http from './http' -export { socket, routing, channels, Channel, CombinedChannel, RealTimeConnection } +export * as http from 'feathers/http' +export { Channel, CombinedChannel } from '@feathersjs/feathers' +export * from './socket/index.js' diff --git a/packages/transport-commons/src/routing/index.ts b/packages/transport-commons/src/routing/index.ts deleted file mode 100644 index 8e4870347..000000000 --- a/packages/transport-commons/src/routing/index.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { Application, FeathersService, ServiceOptions } from '@feathersjs/feathers' -import { Router } from './router' - -declare module '@feathersjs/feathers/lib/declarations' { - interface RouteLookup { - service: Service - params: { [key: string]: any } - } - - // eslint-disable-next-line @typescript-eslint/no-unused-vars - interface Application { - // eslint-disable-line - routes: Router<{ - service: Service - params?: { [key: string]: any } - }> - lookup(path: string): RouteLookup - } -} - -export * from './router' - -const lookup = function (this: Application, path: string) { - const result = this.routes.lookup(path) - - if (result === null) { - return null - } - - const { - params: colonParams, - data: { service, params: dataParams } - } = result - - const params = dataParams ? { ...dataParams, ...colonParams } : colonParams - - return { service, params } -} - -export const routing = () => (app: Application) => { - if (typeof app.lookup === 'function') { - return - } - - const { unuse } = app - - app.routes = new Router() - app.lookup = lookup - app.unuse = function (path: string) { - app.routes.remove(path) - app.routes.remove(`${path}/:__id`) - return unuse.call(this, path) - } - - // Add a mixin that registers a service on the router - app.mixins.push((service: FeathersService, path: string, options: ServiceOptions) => { - const { routeParams: params = {} } = options - - app.routes.insert(path, { service, params }) - app.routes.insert(`${path}/:__id`, { service, params }) - }) -} diff --git a/packages/transport-commons/src/routing/router.ts b/packages/transport-commons/src/routing/router.ts deleted file mode 100644 index e45e6674b..000000000 --- a/packages/transport-commons/src/routing/router.ts +++ /dev/null @@ -1,148 +0,0 @@ -import { stripSlashes } from '@feathersjs/commons' - -export interface LookupData { - params: { [key: string]: string } -} - -export interface LookupResult extends LookupData { - data?: T -} - -export class RouteNode { - data?: T - children: { [key: string]: RouteNode } = {} - placeholders: RouteNode[] = [] - - constructor( - public name: string, - public depth: number - ) {} - - get hasChildren() { - return Object.keys(this.children).length !== 0 || this.placeholders.length !== 0 - } - - insert(path: string[], data: T): RouteNode { - if (this.depth === path.length) { - if (this.data !== undefined) { - throw new Error(`Path ${path.join('/')} already exists`) - } - - this.data = data - return this - } - - const current = path[this.depth] - const nextDepth = this.depth + 1 - - if (current.startsWith(':')) { - // Insert a placeholder node like /messages/:id - const placeholderName = current.substring(1) - let placeholder = this.placeholders.find((p) => p.name === placeholderName) - - if (!placeholder) { - placeholder = new RouteNode(placeholderName, nextDepth) - this.placeholders.push(placeholder) - } - - return placeholder.insert(path, data) - } - - const child = this.children[current] || new RouteNode(current, nextDepth) - - this.children[current] = child - - return child.insert(path, data) - } - - remove(path: string[]) { - if (path.length === this.depth) { - delete this.data - return - } - - const current = path[this.depth] - - if (current.startsWith(':')) { - const placeholderName = current.substring(1) - const placeholder = this.placeholders.find((p) => p.name === placeholderName) - - placeholder.remove(path) - this.placeholders = this.placeholders.filter((p) => p !== placeholder) - } else if (this.children[current]) { - const child = this.children[current] - - child.remove(path) - - if (!child.hasChildren) { - delete this.children[current] - } - } - } - - lookup(path: string[], info: LookupData): LookupResult | null { - if (path.length === this.depth) { - return this.data === undefined - ? null - : { - ...info, - data: this.data - } - } - - const current = path[this.depth] - const child = this.children[current] - - if (child) { - const lookup = child.lookup(path, info) - - if (lookup !== null) { - return lookup - } - } - - // This will return the first placeholder that matches early - for (const placeholder of this.placeholders) { - const result = placeholder.lookup(path, info) - - if (result !== null) { - result.params[placeholder.name] = current - return result - } - } - - return null - } -} - -export class Router { - public caseSensitive = true - - constructor(public root: RouteNode = new RouteNode('', 0)) {} - - getPath(path: string) { - const result = stripSlashes(path).split('/') - - if (!this.caseSensitive) { - return result.map((p) => (p.startsWith(':') ? p : p.toLowerCase())) - } - - return result - } - - insert(path: string, data: T) { - return this.root.insert(this.getPath(path), data) - } - - remove(path: string) { - return this.root.remove(this.getPath(path)) - } - - lookup(path: string) { - if (typeof path !== 'string') { - return null - } - - return this.root.lookup(this.getPath(path), { params: {} }) - } -} diff --git a/packages/transport-commons/src/socket/index.ts b/packages/transport-commons/src/socket/index.ts index 1c21095fd..c4bd8eab6 100644 --- a/packages/transport-commons/src/socket/index.ts +++ b/packages/transport-commons/src/socket/index.ts @@ -1,7 +1,6 @@ -import { Application, getServiceOptions, Params, RealTimeConnection } from '@feathersjs/feathers' -import { channels } from '../channels' -import { routing } from '../routing' -import { getDispatcher, runMethod } from './utils' +import type { Application, Params, RealTimeConnection } from '@feathersjs/feathers' +import { getServiceOptions } from '@feathersjs/feathers' +import { getDispatcher, runMethod } from './utils.js' export interface SocketOptions { done: Promise @@ -21,9 +20,6 @@ export function socket({ done, emit, socketMap, socketKey, getParams }: SocketOp } } - app.configure(channels()) - app.configure(routing()) - app.on('publish', getDispatcher(emit, socketMap, socketKey)) app.on('disconnect', leaveChannels) app.on('logout', (_authResult: any, params: Params) => { diff --git a/packages/transport-commons/src/socket/utils.ts b/packages/transport-commons/src/socket/utils.ts index 768bba469..3b1f2ec3f 100644 --- a/packages/transport-commons/src/socket/utils.ts +++ b/packages/transport-commons/src/socket/utils.ts @@ -1,14 +1,8 @@ -import { - HookContext, - Application, - RealTimeConnection, - createContext, - getServiceOptions -} from '@feathersjs/feathers' +import type { HookContext, Application, RealTimeConnection } from '@feathersjs/feathers' +import { createContext, getServiceOptions, CombinedChannel } from '@feathersjs/feathers' import { NotFound, MethodNotAllowed, BadRequest } from '@feathersjs/errors' import { createDebug } from '@feathersjs/commons' -import isEqual from 'lodash/isEqual' -import { CombinedChannel } from '../channels/channel/combined' +import { isEqual } from 'lodash-es' const debug = createDebug('@feathersjs/transport-commons') diff --git a/packages/transport-commons/test/channels/channel.test.ts b/packages/transport-commons/test/channels/channel.test.ts index 2e9502d9d..708e41f4a 100644 --- a/packages/transport-commons/test/channels/channel.test.ts +++ b/packages/transport-commons/test/channels/channel.test.ts @@ -1,17 +1,11 @@ -/* eslint-disable @typescript-eslint/no-empty-function */ import assert from 'assert' -import { feathers, Application, RealTimeConnection } from '@feathersjs/feathers' -import { channels, keys } from '../../src/channels' -import { Channel } from '../../src/channels/channel/base' -import { CombinedChannel } from '../../src/channels/channel/combined' - -const { CHANNELS } = keys - +import type { Application, RealTimeConnection } from '@feathersjs/feathers' +import { feathers, channelUtils, Channel, CombinedChannel } from '@feathersjs/feathers' describe('app.channel', () => { let app: Application beforeEach(() => { - app = feathers().configure(channels()) + app = feathers() }) describe('base channels', () => { @@ -103,7 +97,7 @@ describe('app.channel', () => { describe('empty channels', () => { it('is an EventEmitter', () => { - const channel = app.channel('emitchannel') + const channel = app.channel('emitchannel') as Channel return new Promise((resolve) => { channel.once('message', (data) => { @@ -116,7 +110,7 @@ describe('app.channel', () => { }) it('empty', (done) => { - const channel = app.channel('test') + const channel = app.channel('test') as Channel const c1 = { id: 1 } const c2 = { id: 2 } @@ -129,7 +123,7 @@ describe('app.channel', () => { it('removes an empty channel', () => { const channel = app.channel('test') - const appChannels = (app as any)[CHANNELS] + const appChannels = (app as any)[channelUtils.CHANNELS] const c1 = { id: 1 } channel.join(c1) @@ -138,12 +132,12 @@ describe('app.channel', () => { assert.strictEqual(Object.keys(appChannels).length, 1) channel.leave(c1) - assert.ok((app as any)[CHANNELS].test === undefined) + assert.ok((app as any)[channelUtils.CHANNELS].test === undefined) assert.strictEqual(Object.keys(appChannels).length, 0) }) it('removes all event listeners from an empty channel', () => { - const channel = app.channel('testing') + const channel = app.channel('testing') as Channel const connection = { id: 1 } channel.on('something', () => {}) @@ -152,7 +146,7 @@ describe('app.channel', () => { channel.join(connection).leave(connection) - assert.ok((app as any)[CHANNELS].testing === undefined) + assert.ok((app as any)[channelUtils.CHANNELS].testing === undefined) assert.strictEqual(channel.listenerCount('something'), 0) assert.strictEqual(channel.listenerCount('empty'), 0) diff --git a/packages/transport-commons/test/channels/dispatch.test.ts b/packages/transport-commons/test/channels/dispatch.test.ts index 8165e3b43..4b5b6d67d 100644 --- a/packages/transport-commons/test/channels/dispatch.test.ts +++ b/packages/transport-commons/test/channels/dispatch.test.ts @@ -1,10 +1,6 @@ -/* eslint-disable @typescript-eslint/no-empty-function */ import assert from 'assert' -import { feathers, Application, HookContext } from '@feathersjs/feathers' -import { channels } from '../../src/channels' -import { Channel } from '../../src/channels/channel/base' -import { CombinedChannel } from '../../src/channels/channel/combined' - +import type { Application, HookContext } from '@feathersjs/feathers' +import { feathers, Channel, CombinedChannel } from '@feathersjs/feathers' class TestService { events = ['foo'] @@ -17,7 +13,7 @@ describe('app.publish', () => { let app: Application beforeEach(() => { - app = feathers().configure(channels()) + app = feathers() }) it('throws an error if service does not send the event', () => { diff --git a/packages/transport-commons/test/channels/index.test.ts b/packages/transport-commons/test/channels/index.test.ts index 1aedf1064..e63c564af 100644 --- a/packages/transport-commons/test/channels/index.test.ts +++ b/packages/transport-commons/test/channels/index.test.ts @@ -1,19 +1,18 @@ /* eslint-disable @typescript-eslint/no-empty-function */ import assert from 'assert' -import { feathers } from '@feathersjs/feathers' -import { channels, keys } from '../../src/channels' +import { feathers, channelUtils } from '@feathersjs/feathers' describe('feathers-channels', () => { it('has app.channel', () => { - const app = feathers().configure(channels()) + const app = feathers() assert.strictEqual(typeof app.channel, 'function') - assert.strictEqual(typeof (app as any)[keys.CHANNELS], 'object') + assert.strictEqual(typeof (app as any)[channelUtils.CHANNELS], 'object') assert.strictEqual(app.channels.length, 0) }) it('throws an error when called with nothing', () => { - const app = feathers().configure(channels()) + const app = feathers() try { app.channel() @@ -23,22 +22,16 @@ describe('feathers-channels', () => { } }) - it('configuring twice does nothing', () => { - feathers().configure(channels()).configure(channels()) - }) - it('does not add things to the service if `dispatch` exists', () => { - const app = feathers() - .configure(channels()) - .use('/test', { - async setup() {}, - publish() { - return this - } - } as any) + const app = feathers().use('/test', { + async setup() {}, + publish() { + return this + } + } as any) const service: any = app.service('test') - assert.ok(!service[keys.PUBLISHERS]) + assert.ok(!service[channelUtils.PUBLISHERS]) }) }) diff --git a/packages/transport-commons/test/client.test.ts b/packages/transport-commons/test/client.test.ts index ea307db77..629810ed1 100644 --- a/packages/transport-commons/test/client.test.ts +++ b/packages/transport-commons/test/client.test.ts @@ -1,10 +1,10 @@ /* eslint-disable @typescript-eslint/ban-ts-comment, @typescript-eslint/no-empty-function */ import assert from 'assert' import { EventEmitter } from 'events' -import { CustomMethods } from '@feathersjs/feathers' +import type { CustomMethods } from '@feathersjs/feathers' import { NotAuthenticated } from '@feathersjs/errors' -import { Service, SocketService } from '../src/client' - +import type { SocketService } from '../src/client.js' +import { Service } from '../src/client.js' declare type DummyCallback = (err: any, data?: any) => void describe('client', () => { diff --git a/packages/transport-commons/test/http.test.ts b/packages/transport-commons/test/http.test.ts index ca15f9c49..a8b070e99 100644 --- a/packages/transport-commons/test/http.test.ts +++ b/packages/transport-commons/test/http.test.ts @@ -1,6 +1,6 @@ import assert from 'assert' -import { HookContext } from '@feathersjs/feathers' -import { http } from '../src' +import type { HookContext } from '@feathersjs/feathers' +import * as http from 'feathers/http' describe('@feathersjs/transport-commons HTTP helpers', () => { it('getResponse body', () => { diff --git a/packages/transport-commons/test/routing/index.test.ts b/packages/transport-commons/test/routing/index.test.ts index 0149262d2..de2c8bc5a 100644 --- a/packages/transport-commons/test/routing/index.test.ts +++ b/packages/transport-commons/test/routing/index.test.ts @@ -1,13 +1,12 @@ /* eslint-disable @typescript-eslint/ban-ts-comment */ import assert from 'assert' -import { feathers, Application } from '@feathersjs/feathers' -import { routing } from '../../src/routing' - +import type { Application } from '@feathersjs/feathers' +import { feathers } from '@feathersjs/feathers' describe('app.routes', () => { let app: Application beforeEach(() => { - app = feathers().configure(routing()) + app = feathers() app.use('/my/service', { get(id: string | number) { @@ -16,10 +15,6 @@ describe('app.routes', () => { }) }) - it('does nothing when configured twice', () => { - feathers().configure(routing()).configure(routing()) - }) - it('has app.lookup and app.routes', () => { assert.strictEqual(typeof app.lookup, 'function') assert.ok(app.routes) diff --git a/packages/transport-commons/test/routing/router.test.ts b/packages/transport-commons/test/routing/router.test.ts index e451bba23..838958ffa 100644 --- a/packages/transport-commons/test/routing/router.test.ts +++ b/packages/transport-commons/test/routing/router.test.ts @@ -1,5 +1,5 @@ import assert from 'assert' -import { Router } from '../../src/routing' +import { Router } from '@feathersjs/feathers' describe('router', () => { it('can lookup and insert a simple path and returns null for invalid path', () => { diff --git a/packages/transport-commons/test/socket/index.test.ts b/packages/transport-commons/test/socket/index.test.ts index 48aacb85b..be7f0fb8a 100644 --- a/packages/transport-commons/test/socket/index.test.ts +++ b/packages/transport-commons/test/socket/index.test.ts @@ -1,9 +1,10 @@ import assert from 'assert' import { EventEmitter } from 'events' -import { feathers, Application, Id, Params } from '@feathersjs/feathers' - -import { socket as commons, SocketOptions } from '../../src/socket' +import type { Application, Id, Params } from '@feathersjs/feathers' +import { feathers } from '@feathersjs/feathers' +import type { SocketOptions } from '../../src/socket/index.js' +import { socket as commons } from '../../src/socket/index.js' class DummyService { async get(id: Id, params: Params) { return { id, params } diff --git a/packages/transport-commons/test/socket/utils.test.ts b/packages/transport-commons/test/socket/utils.test.ts index 8463d6698..6213f07b0 100644 --- a/packages/transport-commons/test/socket/utils.test.ts +++ b/packages/transport-commons/test/socket/utils.test.ts @@ -1,11 +1,11 @@ import assert from 'assert' import { EventEmitter } from 'events' -import { feathers, Application, Params, RealTimeConnection } from '@feathersjs/feathers' +import type { Application, Params, RealTimeConnection } from '@feathersjs/feathers' +import { feathers } from '@feathersjs/feathers' import { NotAuthenticated } from '@feathersjs/errors' -import isPlainObject from 'lodash/isPlainObject' +import { isPlainObject } from 'lodash-es' -import { routing } from '../../src/routing' -import { normalizeError, getDispatcher, runMethod } from '../../src/socket/utils' +import { normalizeError, getDispatcher, runMethod } from '../../src/socket/utils.js' describe('socket commons utils', () => { describe('.normalizeError', () => { @@ -201,7 +201,7 @@ describe('socket commons utils', () => { let app: Application beforeEach(() => { - app = feathers().configure(routing()) + app = feathers() app.use('/myservice', { async get(id: number | string, params: Params) { if (params.query.error) { diff --git a/packages/typebox/LICENSE b/packages/typebox/LICENSE index 7839c824d..f9b502c69 100644 --- a/packages/typebox/LICENSE +++ b/packages/typebox/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2024 Feathers Contributors +Copyright (c) 2025 Feathers Contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/packages/typebox/README.md b/packages/typebox/README.md index b1b3db74f..7234c2baf 100644 --- a/packages/typebox/README.md +++ b/packages/typebox/README.md @@ -18,6 +18,6 @@ Refer to the [Feathers TypeBox documentation](https://feathersjs.com/api/schema/ ## License -Copyright (c) 2024 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) +Copyright (c) 2025 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) Licensed under the [MIT license](LICENSE). diff --git a/packages/typebox/package.json b/packages/typebox/package.json index 3d4bc3ebd..cac137922 100644 --- a/packages/typebox/package.json +++ b/packages/typebox/package.json @@ -3,8 +3,8 @@ "description": "TypeBox integration for @feathersjs/schema", "version": "5.0.35", "homepage": "https://feathersjs.com", - "main": "lib/", - "types": "lib/", + "main": "lib/index.js", + "type": "module", "keywords": [ "feathers", "feathers-plugin" @@ -29,7 +29,7 @@ "url": "https://github.com/feathersjs/feathers/issues" }, "engines": { - "node": ">= 12" + "node": ">= 20" }, "files": [ "CHANGELOG.md", @@ -54,10 +54,13 @@ "access": "public" }, "dependencies": { - "@feathersjs/schema": "^5.0.35", - "@sinclair/typebox": "^0.25.0" + "@feathersjs/schema": "^5.0.35" + }, + "peerDependencies": { + "typebox": "^1.0.0" }, "devDependencies": { + "typebox": "^1.0.0", "@types/mocha": "^10.0.10", "@types/node": "^24.3.1", "mocha": "^11.7.2", diff --git a/packages/typebox/src/default-schemas.ts b/packages/typebox/src/default-schemas.ts index e9fae9167..2971827f8 100644 --- a/packages/typebox/src/default-schemas.ts +++ b/packages/typebox/src/default-schemas.ts @@ -1,5 +1,5 @@ -import { Type, Static } from '@sinclair/typebox' - +import type { Static } from 'typebox' +import { Type } from 'typebox' export const authenticationSettingsSchema = Type.Object({ secret: Type.String({ description: 'The JWT signing secret' }), entity: Type.Optional( diff --git a/packages/typebox/src/index.ts b/packages/typebox/src/index.ts index 098cf22a9..0fe9a95e7 100644 --- a/packages/typebox/src/index.ts +++ b/packages/typebox/src/index.ts @@ -1,25 +1,26 @@ -import { - Type, +import Type, { TObject, TInteger, TOptional, TSchema, - ObjectOptions, TIntersect, TUnion, + type TObjectOptions, type TRecord -} from '@sinclair/typebox' -import { jsonSchema, Validator, DataValidatorMap, Ajv } from '@feathersjs/schema' - -export * from '@sinclair/typebox' -export * from './default-schemas' +} from 'typebox' +import type { Validator, DataValidatorMap } from '@feathersjs/schema' +import { jsonSchema, Ajv } from '@feathersjs/schema' +export * from './default-schemas.js' +export { Type, Static } from 'typebox' export type TDataSchemaMap = { create: TObject update?: TObject patch?: TObject } - +// ------------------------------------------------------------------ +// GetValidator: No Change +// ------------------------------------------------------------------ /** * Returns a compiled validation function for a TypeBox object and AJV validator instance. * @@ -45,18 +46,28 @@ export const getValidator = ( export const getDataValidator = (def: TObject | TDataSchemaMap, validator: Ajv): DataValidatorMap => jsonSchema.getDataValidator(def as any, validator) +// ------------------------------------------------------------------ +// StringEnum: Tip Type.Enum([]) to produce { enum: [...] } schema +// ------------------------------------------------------------------ /** * A TypeBox utility that converts an array of provided strings into a string enum. * @param allowedValues array of strings for the enum * @returns TypeBox.Type */ -export function StringEnum(allowedValues: [...T], options?: { default: T[number] }) { - return Type.Unsafe({ type: 'string', enum: allowedValues, ...options }) +export function StringEnum( + allowedValues: [...Values], + options?: { default: Values[number] } +) { + return Type.Unsafe({ type: 'string', enum: allowedValues, ...options }) } -const arrayOfKeys = (type: T) => { +// ------------------------------------------------------------------ +// ArrayOfKeys: Explicit, Unsafe +// ------------------------------------------------------------------ +export type TArrayOfKeys = Type.TUnsafe<(keyof Type['properties'])[]> +const arrayOfKeys = (type: Type): TArrayOfKeys => { const keys = Object.keys(type.properties) - return Type.Unsafe<(keyof T['properties'])[]>({ + return Type.Unsafe<(keyof Type['properties'])[]>({ type: 'array', maxItems: keys.length, items: { @@ -66,27 +77,58 @@ const arrayOfKeys = (type: T) => { }) } +// ------------------------------------------------------------------ +// SortDefinition: Symmetric Mapping, Return Never +// ------------------------------------------------------------------ +export type TSortDefinition< + Type extends TObject, + Properties extends Type.TProperties = { [K in keyof Type['properties']]: TOptional }, + Return extends Type.TSchema = Type.TObject +> = Return + /** * Creates the `$sort` Feathers query syntax schema for an object schema * - * @param schema The TypeBox object schema + * @param type The TypeBox object schema * @returns The `$sort` syntax schema */ -export function sortDefinition(schema: T) { - const properties = Object.keys(schema.properties).reduce( - (res, key) => { - const result = res as any - - result[key] = Type.Optional(Type.Integer({ minimum: -1, maximum: 1 })) - - return result - }, - {} as { [K in keyof T['properties']]: TOptional } - ) - - return Type.Object(properties, { additionalProperties: false }) +export function sortDefinition(type: Type): TSortDefinition { + const properties = Object.keys(type.properties).reduce((res, key) => { + const result = res as any + result[key] = Type.Optional(Type.Integer({ minimum: -1, maximum: 1 })) + return result + }, {} as Type.TProperties) + return Type.Object(properties, { additionalProperties: false }) as never } +// ------------------------------------------------------------------ +// QueryProperty: Symmetric Mapping, Return Never +// ------------------------------------------------------------------ +export type TQueryProperty< + Def extends TSchema, + Extension extends Type.TProperties, + Return extends Type.TSchema = Type.TUnion< + [ + Def, + Type.TPartial< + Type.TIntersect< + [ + Type.TObject<{ + $gt: Def + $gte: Def + $lt: Def + $lte: Def + $ne: Def + $in: Type.TArray + $nin: Type.TArray + }>, + Type.TObject + ] + > + > + ] + > +> = Return /** * Returns the standard Feathers query syntax for a property schema, * including operators like `$gt`, `$lt` etc. for a single property @@ -95,37 +137,44 @@ export function sortDefinition(schema: T) { * @param extension Additional properties to add to the property query * @returns The Feathers query syntax schema */ -export const queryProperty = ( - def: T, - extension: X = {} as X -) => - Type.Optional( - Type.Union([ - def, - Type.Partial( - Type.Intersect( - [ - Type.Object({ - $gt: def, - $gte: def, - $lt: def, - $lte: def, - $ne: def, - $in: def.type === 'array' ? def : Type.Array(def), - $nin: def.type === 'array' ? def : Type.Array(def) - }), - Type.Object(extension) - ], - { additionalProperties: false } - ) +export const queryProperty = ( + def: Def, + extension: Extension +): TQueryProperty => + Type.Union([ + def, + Type.Partial( + Type.Intersect( + [ + Type.Object({ + $gt: def, + $gte: def, + $lt: def, + $lte: def, + $ne: def, + $in: Type.Array(def), + $nin: Type.Array(def) + }), + Type.Object((extension || {}) as Extension) + ], + { additionalProperties: false } ) - ]) - ) - -type QueryProperty = ReturnType< - typeof queryProperty -> + ) + ]) as any +// ------------------------------------------------------------------ +// QueryProperties: Symmetric Mapping, Return Never +// ------------------------------------------------------------------ +type TQueryProperties< + // Parameters + Type extends TObject, + Extensions extends { [K in keyof Type['properties']]?: { [key: string]: TSchema } }, + // Variables + Return + Properties extends Type.TProperties = { + [K in keyof Type['properties']]: TQueryProperty> + }, + Return extends Type.TSchema = Type.TOptional> +> = Return /** * Creates a Feathers query syntax schema for the properties defined in `definition`. * @@ -134,68 +183,86 @@ type QueryProperty = Re * @returns The Feathers query syntax schema */ export const queryProperties = < - T extends TObject, - X extends { [K in keyof T['properties']]?: { [key: string]: TSchema } } + Type extends TObject, + Extensions extends { [K in keyof Type['properties']]?: { [key: string]: TSchema } } >( - definition: T, - extensions: X = {} as X -) => { - const properties = Object.keys(definition.properties).reduce( - (res, key) => { - const result = res as any - const value = definition.properties[key] - - result[key] = queryProperty(value, extensions[key]) + definition: Type, + extensions: Extensions +): TQueryProperties => { + const properties = Object.keys(definition.properties).reduce((res, key) => { + const result = res as any + const value = definition.properties[key] - return result - }, - {} as { [K in keyof T['properties']]: QueryProperty } - ) + result[key] = queryProperty(value, extensions[key] || {}) - return Type.Optional(Type.Object(properties, { additionalProperties: false })) + return result + }, {}) + return Type.Optional(Type.Object(properties, { additionalProperties: false })) as never } +// ------------------------------------------------------------------ +// QuerySyntax: Symmetric Mapping, Return Never +// ------------------------------------------------------------------ +export type TQuerySyntax< + // Parameters + Type extends TObject, + Extensions extends { [K in keyof Type['properties']]?: { [key: string]: TSchema } }, + // Variables + Return + PropertySchema extends Type.TObject = TQueryProperties, + Or extends TSchema = Type.TArray, + And extends TSchema = Type.TArray>, + Return extends TSchema = Type.TPartial< + Type.TObject< + { + $limit: Type.TNumber + $skip: Type.TNumber + $sort: TSortDefinition + $select: TArrayOfKeys + $or: Or + $and: And + } & PropertySchema['properties'] + > // todo: consider Simplify to flatten intersection + > +> = Return /** * Creates a TypeBox schema for the complete Feathers query syntax including `$limit`, $skip`, `$or` * and `$sort` and `$select` for the allowed properties. * * @param type The properties to create the query syntax for - * @param extensions Additional properties to add to the query syntax + * @param extensions Additional properties to add to the query syntax, use `{}` if none * @param options Options for the TypeBox object schema * @returns A TypeBox object representing the complete Feathers query syntax for the given properties */ export const querySyntax = < - T extends TObject, - X extends { [K in keyof T['properties']]?: { [key: string]: TSchema } } + Type extends TObject, + Extensions extends { [K in keyof Type['properties']]?: { [key: string]: TSchema } } >( - type: T, - extensions: X = {} as X, - options: ObjectOptions = { additionalProperties: false } -) => { + type: Type, + extensions: Extensions, + options: TObjectOptions = { additionalProperties: false } +): TQuerySyntax => { const propertySchema = queryProperties(type, extensions) const $or = Type.Array(propertySchema) const $and = Type.Array(Type.Union([propertySchema, Type.Object({ $or })])) - - return Type.Intersect( - [ - Type.Partial( - Type.Object( - { - $limit: Type.Number({ minimum: 0 }), - $skip: Type.Number({ minimum: 0 }), - $sort: sortDefinition(type), - $select: arrayOfKeys(type), - $and, - $or - }, - { additionalProperties: false } - ) - ), - propertySchema - ], + return Type.Partial( + Type.Object( + { + $limit: Type.Number({ minimum: 0 }), + $skip: Type.Number({ minimum: 0 }), + $sort: sortDefinition(type), + $select: arrayOfKeys(type), + $and, + $or, + ...propertySchema.properties + }, + { additionalProperties: false } + ), options - ) + ) as never } - -export const ObjectIdSchema = () => +// ------------------------------------------------------------------ +// ObjectSchemaId: Explicit Return +// ------------------------------------------------------------------ +export type TObjectIdSchema = Type.TUnion<[Type.TString, Type.TObject]> +export const ObjectIdSchema = (): TObjectIdSchema => Type.Union([Type.String({ objectid: true }), Type.Object({}, { additionalProperties: true })]) diff --git a/packages/typebox/test/index.test.ts b/packages/typebox/test/index.test.ts index bfb82718d..479185920 100644 --- a/packages/typebox/test/index.test.ts +++ b/packages/typebox/test/index.test.ts @@ -1,16 +1,15 @@ import assert from 'assert' import { ObjectId as MongoObjectId } from 'mongodb' import { Ajv } from '@feathersjs/schema' +import type { Static } from '../src/index.js' import { querySyntax, Type, - Static, defaultAppConfiguration, getDataValidator, getValidator, ObjectIdSchema -} from '../src' - +} from '../src/index.js' describe('@feathersjs/schema/typebox', () => { describe('querySyntax', () => { it('basics', async () => { @@ -18,7 +17,7 @@ describe('@feathersjs/schema/typebox', () => { name: Type.String(), age: Type.Number() }) - const querySchema = querySyntax(schema) + const querySchema = querySyntax(schema, {}) type Query = Static @@ -41,7 +40,7 @@ describe('@feathersjs/schema/typebox', () => { }) it('querySyntax works with no properties', async () => { - const schema = querySyntax(Type.Object({})) + const schema = querySyntax(Type.Object({}), {}) new Ajv().compile(schema) }) @@ -80,36 +79,17 @@ describe('@feathersjs/schema/typebox', () => { }) }) - it('$in and $nin works with array type', async () => { - const schema = Type.Object({ - things: Type.Array(Type.Number()) - }) - const querySchema = querySyntax(schema) - const validator = new Ajv().compile(querySchema) - - type Query = Static - - const query: Query = { - things: { - $in: [10, 20], - $nin: [30] - } - } - - const validated = (await validator(query)) as any as Query - - assert.ok(validated) - }) - it('defaultAppConfiguration', async () => { - const configSchema = Type.Intersect([ - defaultAppConfiguration, - Type.Object({ - host: Type.String(), - port: Type.Number(), - public: Type.String() - }) - ]) + const configSchema = Type.Evaluate( + Type.Intersect([ + defaultAppConfiguration, + Type.Object({ + host: Type.String(), + port: Type.Number(), + public: Type.String() + }) + ]) + ) const validator = new Ajv().compile(configSchema) const validated = await validator({ diff --git a/tsconfig.json b/tsconfig.json index 3144d1beb..4dff15bf8 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,15 +3,15 @@ // TODO: We should remove this but lib types break all the time "skipLibCheck": true, /* Basic Options */ - "target": "es2018", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */ - "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ + "target": "es2018" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */, + "module": "ES2020" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */, // "lib": [], /* Specify library files to be included in the compilation. */ // "allowJs": true, /* Allow javascript files to be compiled. */ // "checkJs": true, /* Report errors in .js files. */ // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ - "declaration": true, /* Generates corresponding '.d.ts' file. */ + "declaration": true /* Generates corresponding '.d.ts' file. */, // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ - "sourceMap": true, /* Generates corresponding '.map' file. */ + "sourceMap": true /* Generates corresponding '.map' file. */, // "outFile": "./", /* Concatenate and emit output to single file. */ // "rootDir": "./src", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ // "composite": true, /* Enable project compilation */ @@ -22,29 +22,29 @@ // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ /* Strict Type-Checking Options */ - "strict": true, /* Enable all strict type-checking options. */ + "strict": true /* Enable all strict type-checking options. */, // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ - "strictNullChecks": false, /* Enable strict null checks. */ + "strictNullChecks": false /* Enable strict null checks. */, // "strictFunctionTypes": true, /* Enable strict checking of function types. */ // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ /* Additional Checks */ - "noUnusedLocals": true, /* Report errors on unused locals. */ - "noUnusedParameters": true, /* Report errors on unused parameters. */ - "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ + "noUnusedLocals": true /* Report errors on unused locals. */, + "noUnusedParameters": true /* Report errors on unused parameters. */, + "noImplicitReturns": true /* Report error when not all code paths in function return a value. */, // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ /* Module Resolution Options */ - // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ + "moduleResolution": "bundler" /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */, // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ // "typeRoots": [], /* List of folders to include type definitions from. */ // "types": [], /* Type declaration files to be included in compilation. */ // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ - "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ + "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ /* Source Map Options */ @@ -57,4 +57,4 @@ // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ } -} \ No newline at end of file +}