diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml index 0e5fa98d11..8dd253a6f7 100644 --- a/.github/workflows/nodejs.yml +++ b/.github/workflows/nodejs.yml @@ -8,23 +8,7 @@ jobs: strategy: matrix: - node-version: [18.x, 20.x] - - services: - postgres: - image: postgres:latest - env: - POSTGRES_DB: feathers - POSTGRES_PASSWORD: postgres - POSTGRES_PORT: 5432 - POSTGRES_USER: postgres - ports: - - 5432:5432 - options: >- - --health-cmd pg_isready - --health-interval 10s - --health-timeout 5s - --health-retries 5 + node-version: [20.x, 24.x] steps: - uses: actions/checkout@v2 @@ -32,8 +16,11 @@ jobs: uses: actions/setup-node@v1 with: node-version: ${{ matrix.node-version }} - - run: npm install + - run: npm i -g npm + # Removing node_modules and package-lock.json is a workaround for some Rollup on Linux bug + - run: | + rm -rf node_modules package-lock.json + npm install - run: npm test env: CI: true - TEST_DB: postgres diff --git a/.mocharc.json b/.mocharc.json deleted file mode 100644 index afb61cb4d6..0000000000 --- a/.mocharc.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "timeout": 30000, - "require": ["ts-node/register", "source-map-support/register"], - "reporter": "Dot", - "extension": ".test.ts", - "exit": true -} diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000000..2bd5a0a98a --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +22 diff --git a/.nycrc b/.nycrc deleted file mode 100644 index bea9ca089d..0000000000 --- a/.nycrc +++ /dev/null @@ -1,47 +0,0 @@ -{ - "verbose": false, - "tempDirectory": "./coverage/.tmp", - "semistandard": { - "env": [ - "mocha" - ] - }, - "extension": [ - ".ts", - ".tsx", - ".js" - ], - "exclude": [ - "**/test/*", - "**/dist/*", - "**/*.dist.js", - "**/_templates/*", - "**/tests/*", - "**/adapter-tests/*" - ], - "print": "detail", - "reporter": [ - "html", - "text", - "text-summary", - "lcov" - ], - "watermarks": { - "statements": [ - 70, - 90 - ], - "lines": [ - 70, - 90 - ], - "functions": [ - 70, - 90 - ], - "branches": [ - 70, - 90 - ] - } -} diff --git a/CHANGELOG.md b/CHANGELOG.md index ceff2d33cf..cb4a6d9265 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,36 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [6.0.0-pre.3](https://github.com/feathersjs/feathers/compare/v6.0.0-pre.2...v6.0.0-pre.3) (2025-10-10) + +### Bug Fixes + +- Fix redirect URI encoding ([#3621](https://github.com/feathersjs/feathers/issues/3621)) ([4dbcce5](https://github.com/feathersjs/feathers/commit/4dbcce598d894846899417cd51820a70b00f22e0)) + +# [6.0.0-pre.2](https://github.com/feathersjs/feathers/compare/v6.0.0-pre.1...v6.0.0-pre.2) (2025-09-04) + +### Bug Fixes + +- Add typesVersions for TypeScript compatibility ([87c181c](https://github.com/feathersjs/feathers/commit/87c181cf8d3bcd4f86d0caad41de83d220077ad8)) + +# [6.0.0-pre.1](https://github.com/feathersjs/feathers/compare/v6.0.0-pre.0...v6.0.0-pre.1) (2025-09-03) + +### Bug Fixes + +- Add compatibility exports ([#3605](https://github.com/feathersjs/feathers/issues/3605)) ([3aed869](https://github.com/feathersjs/feathers/commit/3aed8696ca95fe4a4351c2d7e7f274ab66b50c09)) +- Add registerPublisher method to protected method list ([2c0664a](https://github.com/feathersjs/feathers/commit/2c0664acf97dca3bf7a2efaf3564f04c3de5842e)) + +# [6.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v5.0.34...v6.0.0-pre.0) (2025-08-30) + +### Bug Fixes + +- Make handling of async iterables consistent ([#3602](https://github.com/feathersjs/feathers/issues/3602)) ([a29ea3c](https://github.com/feathersjs/feathers/commit/a29ea3c89bf0fe07f0aec823ef3f3e33941f1aa3)) + +### Features + +- SSE real-time events ([#3601](https://github.com/feathersjs/feathers/issues/3601)) ([fbfb75c](https://github.com/feathersjs/feathers/commit/fbfb75c5a2fde7ff785a71e787e746952b7a47b3)) +- V6 packages refactor ([#3596](https://github.com/feathersjs/feathers/issues/3596)) ([364aab5](https://github.com/feathersjs/feathers/commit/364aab563542fc9d6dd96c1f5f48b146727d7d1e)) + ## [5.0.34](https://github.com/feathersjs/feathers/compare/v5.0.33...v5.0.34) (2025-05-03) ### Bug Fixes diff --git a/LICENSE b/LICENSE index 7712f870f3..f9b502c69f 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 1f6cebbdec..b6ed73dd0e 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ - Feathers - The API and real-time application framework + Feathers - The API and real-time application framework --- @@ -10,7 +10,7 @@ Feathers is a full-stack framework for creating web APIs and real-time applications with TypeScript or JavaScript. -Feathers can interact with any backend technology, supports many databases out of the box and works with any frontend like React, VueJS, Angular, React Native, Android or iOS. +Feathers works with Node.js, Deno, Bun, Cloudflare Workers and standalone in the browser and can interact with any backend technology, supports many databases out of the box and works with any frontend like React, VueJS, Angular, React Native, Android or iOS. # Getting started @@ -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/package.json b/docs/package.json index c74a961288..a50f08ac38 100644 --- a/docs/package.json +++ b/docs/package.json @@ -2,6 +2,9 @@ "name": "docs", "private": true, "type": "module", + "engines": { + "node": ">= 22" + }, "scripts": { "dev": "vitepress --port 3333 --open", "build": "vitepress build", @@ -22,24 +25,25 @@ "@feathersjs/generators": "^5.0.34", "@iconify-json/carbon": "^1.2.11", "@types/node": "^24.1.0", - "@unocss/preset-typography": "^66.3.3", - "@unocss/reset": "^66.3.3", - "@unocss/transformer-directives": "^66.3.3", + "@unocss/preset-typography": "^66.4.0", + "@unocss/reset": "^66.4.0", + "@unocss/transformer-directives": "^66.4.0", "@vitejs/plugin-vue": "^6.0.1", "esno": "^4.8.0", "fast-glob": "^3.3.3", - "flexsearch": "^0.8.205", + "flexsearch": "^0.7.3", "https-localhost": "^4.7.1", "markdown-it": "^14.1.0", "sass": "^1.89.2", "sitemap": "^8.0.0", - "unocss": "^66.3.3", + "unocss": "^66.4.0", "unplugin-auto-import": "^19.3.0", "unplugin-vue-components": "^28.8.0", "vite-plugin-pwa": "^1.0.2", "vitepress": "^1.6.3", "vitepress-plugin-google-analytics": "^1.0.2", "vitepress-plugin-search": "^1.0.4-alpha.22", + "vitest": "^3.2.4", "workbox-window": "^7.3.0" } } diff --git a/generators/package.ts b/generators/package.ts deleted file mode 100644 index 1d351338a0..0000000000 --- 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 06b063adcc..0000000000 --- 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/license.tpl.ts b/generators/package/license.tpl.ts deleted file mode 100644 index bf9eda7666..0000000000 --- a/generators/package/license.tpl.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { generator, renderTemplate, toFile } from '@featherscloud/pinion' -import { ModuleContext } from '../package' - -interface Context extends ModuleContext {} - -export const generate = (context: Context) => - generator(context).then( - renderTemplate( - `The MIT License (MIT) - -Copyright (c) ${new Date().getFullYear()} 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 -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -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/generators/package/package.json.tpl.ts b/generators/package/package.json.tpl.ts deleted file mode 100644 index 1a27515aef..0000000000 --- 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 f4495d2756..0000000000 --- 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 25f5b7d468..0000000000 --- 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 875f9f4902..0000000000 --- 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/lerna.json b/lerna.json index 4c7a1b2eef..9d9f1b53c5 100644 --- a/lerna.json +++ b/lerna.json @@ -1,13 +1,13 @@ { "ci": false, "packages": ["packages/*"], - "version": "5.0.34", + "version": "6.0.0-pre.3", "command": { "bootstrap": { "hoist": true }, "publish": { - "allowBranch": ["crow", "dove"], + "allowBranch": ["crow", "dove", "v6"], "message": "chore(release): publish %s", "conventionalCommits": true, "createRelease": "github" diff --git a/package-lock.json b/package-lock.json index ba8dbe46cb..65ad7af2ec 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,30 +1,31 @@ { - "name": "@feathersjs/feathers", + "name": "feathers", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "@feathersjs/feathers", + "name": "feathers", "license": "MIT", "workspaces": [ "docs", "packages/*" ], "devDependencies": { - "@featherscloud/pinion": "^0.5.4", - "@typescript-eslint/eslint-plugin": "^7.8.0", - "@typescript-eslint/parser": "^7.8.0", - "c8": "^9.1.0", - "eslint": "^8.57.0", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-prettier": "^5.1.3", - "lerna": "^8.1.2", - "npm-check-updates": "^16.14.20", - "prettier": "^3.2.5", - "typescript": "^5.4.5" + "@featherscloud/pinion": "^0.5.5", + "@typescript-eslint/eslint-plugin": "^8.38.0", + "@typescript-eslint/parser": "^8.38.0", + "@vitest/coverage-v8": "^3.2.4", + "eslint": "^9.32.0", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-prettier": "^5.5.3", + "lerna": "^8.2.3", + "npm-check-updates": "^18.0.2", + "prettier": "^3.6.2", + "typescript": "^5.8.0", + "vitest": "^3.2.4" }, "engines": { - "node": ">= 20" + "node": ">= 22" }, "funding": { "type": "github", @@ -44,120 +45,53 @@ "@feathersjs/generators": "^5.0.34", "@iconify-json/carbon": "^1.2.11", "@types/node": "^24.1.0", - "@unocss/preset-typography": "^66.3.3", - "@unocss/reset": "^66.3.3", - "@unocss/transformer-directives": "^66.3.3", + "@unocss/preset-typography": "^66.4.0", + "@unocss/reset": "^66.4.0", + "@unocss/transformer-directives": "^66.4.0", "@vitejs/plugin-vue": "^6.0.1", "esno": "^4.8.0", "fast-glob": "^3.3.3", - "flexsearch": "^0.8.205", + "flexsearch": "^0.7.3", "https-localhost": "^4.7.1", "markdown-it": "^14.1.0", "sass": "^1.89.2", "sitemap": "^8.0.0", - "unocss": "^66.3.3", + "unocss": "^66.4.0", "unplugin-auto-import": "^19.3.0", "unplugin-vue-components": "^28.8.0", "vite-plugin-pwa": "^1.0.2", "vitepress": "^1.6.3", "vitepress-plugin-google-analytics": "^1.0.2", "vitepress-plugin-search": "^1.0.4-alpha.22", + "vitest": "^3.2.4", "workbox-window": "^7.3.0" - } - }, - "docs/node_modules/@vitejs/plugin-vue": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.1.tgz", - "integrity": "sha512-+MaE752hU0wfPFJEUAIxqw18+20euHHdxVtMvbFcOEpjEyfqXH/5DCoTHiVJ0J29EhTJdoTkjEv5YBKU9dnoTw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rolldown/pluginutils": "1.0.0-beta.29" }, "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "peerDependencies": { - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0", - "vue": "^3.2.25" + "node": ">= 22" } }, - "docs/node_modules/@vueuse/core": { - "version": "13.6.0", - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-13.6.0.tgz", - "integrity": "sha512-DJbD5fV86muVmBgS9QQPddVX7d9hWYswzlf4bIyUD2dj8GC46R1uNClZhVAmsdVts4xb2jwp1PbpuiA50Qee1A==", + "node_modules/@algolia/abtesting": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.6.0.tgz", + "integrity": "sha512-c4M/Z/KWkEG+RHpZsWKDTTlApXu3fe4vlABNcpankWBhdMe4oPZ/r4JxEr2zKUP6K+BT66tnp8UbHmgOd/vvqQ==", + "dev": true, "license": "MIT", "dependencies": { - "@types/web-bluetooth": "^0.0.21", - "@vueuse/metadata": "13.6.0", - "@vueuse/shared": "13.6.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "vue": "^3.5.0" - } - }, - "docs/node_modules/@vueuse/metadata": { - "version": "13.6.0", - "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-13.6.0.tgz", - "integrity": "sha512-rnIH7JvU7NjrpexTsl2Iwv0V0yAx9cw7+clymjKuLSXG0QMcLD0LDgdNmXic+qL0SGvgSVPEpM9IDO/wqo1vkQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "docs/node_modules/@vueuse/shared": { - "version": "13.6.0", - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-13.6.0.tgz", - "integrity": "sha512-pDykCSoS2T3fsQrYqf9SyF0QXWHmcGPQ+qiOVjlYSzlWd9dgppB2bFSM1GgKKkt7uzn0BBMV3IbJsUfHG2+BCg==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" + "@algolia/client-common": "5.40.0", + "@algolia/requester-browser-xhr": "5.40.0", + "@algolia/requester-fetch": "5.40.0", + "@algolia/requester-node-http": "5.40.0" }, - "peerDependencies": { - "vue": "^3.5.0" + "engines": { + "node": ">= 14.0.0" } }, - "docs/node_modules/flexsearch": { - "version": "0.8.205", - "resolved": "https://registry.npmjs.org/flexsearch/-/flexsearch-0.8.205.tgz", - "integrity": "sha512-REFjMqy86DKkCTJ4gIE42c9MVm9t1vUWfEub/8taixYuhvyu4jd4XmFALk5VuKW4GH4VLav8A4BJboTsslHF1w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/ts-thomas" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/flexsearch" - }, - { - "type": "patreon", - "url": "https://patreon.com/user?u=96245532" - }, - { - "type": "liberapay", - "url": "https://liberapay.com/ts-thomas" - }, - { - "type": "paypal", - "url": "https://www.paypal.com/donate/?hosted_button_id=GEVR88FC9BWRW" - }, - { - "type": "bountysource", - "url": "https://salt.bountysource.com/teams/ts-thomas" - } - ], - "license": "Apache-2.0" - }, "node_modules/@algolia/autocomplete-core": { "version": "1.17.7", "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.17.7.tgz", "integrity": "sha512-BjiPOW6ks90UKl7TwMv7oNQMnzU+t/wk9mgIDi6b1tXpUek7MW0lbNOUHpvam9pe3lVCf4xPFT+lK7s+e+fs7Q==", "dev": true, + "license": "MIT", "dependencies": { "@algolia/autocomplete-plugin-algolia-insights": "1.17.7", "@algolia/autocomplete-shared": "1.17.7" @@ -168,6 +102,7 @@ "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.17.7.tgz", "integrity": "sha512-Jca5Ude6yUOuyzjnz57og7Et3aXjbwCSDf/8onLHSQgw1qW3ALl9mrMWaXb5FmPVkV3EtkD2F/+NkT6VHyPu9A==", "dev": true, + "license": "MIT", "dependencies": { "@algolia/autocomplete-shared": "1.17.7" }, @@ -180,6 +115,7 @@ "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.17.7.tgz", "integrity": "sha512-ggOQ950+nwbWROq2MOCIL71RE0DdQZsceqrg32UqnhDz8FlO9rL8ONHNsI2R1MH0tkgVIDKI/D0sMiUchsFdWA==", "dev": true, + "license": "MIT", "dependencies": { "@algolia/autocomplete-shared": "1.17.7" }, @@ -193,186 +129,200 @@ "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.17.7.tgz", "integrity": "sha512-o/1Vurr42U/qskRSuhBH+VKxMvkkUVTLU6WZQr+L5lGZZLYWyhdzWjW0iGXY7EkwRTjBqvN2EsR81yCTGV/kmg==", "dev": true, + "license": "MIT", "peerDependencies": { "@algolia/client-search": ">= 4.9.1 < 6", "algoliasearch": ">= 4.9.1 < 6" } }, "node_modules/@algolia/client-abtesting": { - "version": "5.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.24.0.tgz", - "integrity": "sha512-pNTIB5YqVVwu6UogvdX8TqsRZENaflqMMjdY7/XIPMNGrBoNH9tewINLI7+qc9tIaOLcAp3ZldqoEwAihZZ3ig==", + "version": "5.40.0", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.40.0.tgz", + "integrity": "sha512-qegVlgHtmiS8m9nEsuKUVhlw1FHsIshtt5nhNnA6EYz3g+tm9+xkVZZMzkrMLPP7kpoheHJZAwz2MYnHtwFa9A==", "dev": true, + "license": "MIT", "dependencies": { - "@algolia/client-common": "5.24.0", - "@algolia/requester-browser-xhr": "5.24.0", - "@algolia/requester-fetch": "5.24.0", - "@algolia/requester-node-http": "5.24.0" + "@algolia/client-common": "5.40.0", + "@algolia/requester-browser-xhr": "5.40.0", + "@algolia/requester-fetch": "5.40.0", + "@algolia/requester-node-http": "5.40.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-analytics": { - "version": "5.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.24.0.tgz", - "integrity": "sha512-IF+r9RRQsIf0ylIBNFxo7c6hDxxuhIfIbffhBXEF1HD13rjhP5AVfiaea9RzbsAZoySkm318plDpH/nlGIjbRA==", + "version": "5.40.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.40.0.tgz", + "integrity": "sha512-Dw2c+6KGkw7mucnnxPyyMsIGEY8+hqv6oB+viYB612OMM3l8aNaWToBZMnNvXsyP+fArwq7XGR+k3boPZyV53A==", "dev": true, + "license": "MIT", "dependencies": { - "@algolia/client-common": "5.24.0", - "@algolia/requester-browser-xhr": "5.24.0", - "@algolia/requester-fetch": "5.24.0", - "@algolia/requester-node-http": "5.24.0" + "@algolia/client-common": "5.40.0", + "@algolia/requester-browser-xhr": "5.40.0", + "@algolia/requester-fetch": "5.40.0", + "@algolia/requester-node-http": "5.40.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-common": { - "version": "5.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.24.0.tgz", - "integrity": "sha512-p8K6tiXQTebRBxbrzWIfGCvfkT+Umml+2lzI92acZjHsvl6KYH6igOfVstKqXJRei9pvRzEEvVDNDLXDVleGTA==", + "version": "5.40.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.40.0.tgz", + "integrity": "sha512-dbE4+MJIDsTghG3hUYWBq7THhaAmqNqvW9g2vzwPf5edU4IRmuYpKtY3MMotes8/wdTasWG07XoaVhplJBlvdg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-insights": { - "version": "5.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.24.0.tgz", - "integrity": "sha512-jOHF0+tixR3IZJMhZPquFNdCVPzwzzXoiqVsbTvfKojeaY6ZXybgUiTSB8JNX+YpsUT8Ebhu3UvRy4mw2PbEzw==", + "version": "5.40.0", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.40.0.tgz", + "integrity": "sha512-SH6zlROyGUCDDWg71DlCnbbZ/zEHYPZC8k901EAaBVhvY43Ju8Wa6LAcMPC4tahcDBgkG2poBy8nJZXvwEWAlQ==", "dev": true, + "license": "MIT", "dependencies": { - "@algolia/client-common": "5.24.0", - "@algolia/requester-browser-xhr": "5.24.0", - "@algolia/requester-fetch": "5.24.0", - "@algolia/requester-node-http": "5.24.0" + "@algolia/client-common": "5.40.0", + "@algolia/requester-browser-xhr": "5.40.0", + "@algolia/requester-fetch": "5.40.0", + "@algolia/requester-node-http": "5.40.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-personalization": { - "version": "5.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.24.0.tgz", - "integrity": "sha512-Fx/Fp6d8UmDBHecTt0XYF8C9TAaA3qeCQortfGSZzWp4gVmtrUCFNZ1SUwb8ULREnO9DanVrM5hGE8R8C4zZTQ==", + "version": "5.40.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.40.0.tgz", + "integrity": "sha512-EgHjJEEf7CbUL9gJHI1ULmAtAFeym2cFNSAi1uwHelWgLPcnLjYW2opruPxigOV7NcetkGu+t2pcWOWmZFuvKQ==", "dev": true, + "license": "MIT", "dependencies": { - "@algolia/client-common": "5.24.0", - "@algolia/requester-browser-xhr": "5.24.0", - "@algolia/requester-fetch": "5.24.0", - "@algolia/requester-node-http": "5.24.0" + "@algolia/client-common": "5.40.0", + "@algolia/requester-browser-xhr": "5.40.0", + "@algolia/requester-fetch": "5.40.0", + "@algolia/requester-node-http": "5.40.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-query-suggestions": { - "version": "5.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.24.0.tgz", - "integrity": "sha512-F8ypOedSMhz6W7zuT5O1SXXsdXSOVhY2U6GkRbYk/mzrhs3jWFR3uQIfeQVWmsJjUwIGZmPoAr9E+T/Zm2M4wA==", + "version": "5.40.0", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.40.0.tgz", + "integrity": "sha512-HvE1jtCag95DR41tDh7cGwrMk4X0aQXPOBIhZRmsBPolMeqRJz0kvfVw8VCKvA1uuoAkjFfTG0X0IZED+rKXoA==", "dev": true, + "license": "MIT", "dependencies": { - "@algolia/client-common": "5.24.0", - "@algolia/requester-browser-xhr": "5.24.0", - "@algolia/requester-fetch": "5.24.0", - "@algolia/requester-node-http": "5.24.0" + "@algolia/client-common": "5.40.0", + "@algolia/requester-browser-xhr": "5.40.0", + "@algolia/requester-fetch": "5.40.0", + "@algolia/requester-node-http": "5.40.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-search": { - "version": "5.24.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.24.0.tgz", - "integrity": "sha512-k+nuciQuq7WERNNE+hsx3DX636zIy+9R4xdtvW3PANT2a2BDGOv3fv2mta8+QUMcVTVcGe/Mo3QCb4pc1HNoxA==", + "version": "5.40.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.40.0.tgz", + "integrity": "sha512-nlr/MMgoLNUHcfWC5Ns2ENrzKx9x51orPc6wJ8Ignv1DsrUmKm0LUih+Tj3J+kxYofzqQIQRU495d4xn3ozMbg==", "dev": true, + "license": "MIT", "dependencies": { - "@algolia/client-common": "5.24.0", - "@algolia/requester-browser-xhr": "5.24.0", - "@algolia/requester-fetch": "5.24.0", - "@algolia/requester-node-http": "5.24.0" + "@algolia/client-common": "5.40.0", + "@algolia/requester-browser-xhr": "5.40.0", + "@algolia/requester-fetch": "5.40.0", + "@algolia/requester-node-http": "5.40.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/ingestion": { - "version": "1.24.0", - "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.24.0.tgz", - "integrity": "sha512-/lqVxmrvwoA+OyVK4XLMdz/PJaCTW4qYchX1AZ+98fdnH3K6XM/kMydQLfP0bUNGBQbmVrF88MqhqZRnZEn/MA==", + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.40.0.tgz", + "integrity": "sha512-OfHnhE+P0f+p3i90Kmshf9Epgesw5oPV1IEUOY4Mq1HV7cQk16gvklVN1EaY/T9sVavl+Vc3g4ojlfpIwZFA4g==", "dev": true, + "license": "MIT", "dependencies": { - "@algolia/client-common": "5.24.0", - "@algolia/requester-browser-xhr": "5.24.0", - "@algolia/requester-fetch": "5.24.0", - "@algolia/requester-node-http": "5.24.0" + "@algolia/client-common": "5.40.0", + "@algolia/requester-browser-xhr": "5.40.0", + "@algolia/requester-fetch": "5.40.0", + "@algolia/requester-node-http": "5.40.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/monitoring": { - "version": "1.24.0", - "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.24.0.tgz", - "integrity": "sha512-cRisDXQJhvfZCXL4hD22qca2CmW52TniOx6L7pvkaBDx0oQk1k9o+3w11fgfcCG+47OndMeNx5CMpu+K+COMzg==", + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.40.0.tgz", + "integrity": "sha512-SWANV32PTKhBYvwKozeWP9HOnVabOixAuPdFFGoqtysTkkwutrtGI/rrh80tvG+BnQAmZX0vUmD/RqFZVfr/Yg==", "dev": true, + "license": "MIT", "dependencies": { - "@algolia/client-common": "5.24.0", - "@algolia/requester-browser-xhr": "5.24.0", - "@algolia/requester-fetch": "5.24.0", - "@algolia/requester-node-http": "5.24.0" + "@algolia/client-common": "5.40.0", + "@algolia/requester-browser-xhr": "5.40.0", + "@algolia/requester-fetch": "5.40.0", + "@algolia/requester-node-http": "5.40.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/recommend": { - "version": "5.24.0", - "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.24.0.tgz", - "integrity": "sha512-JTMz0JqN2gidvKa2QCF/rMe8LNtdHaght03px2cluZaZfBRYy8TgHgkCeBspKKvV/abWJwl7J0FzWThCshqT3w==", + "version": "5.40.0", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.40.0.tgz", + "integrity": "sha512-1Qxy9I5bSb3mrhPk809DllMa561zl5hLsMR6YhIqNkqQ0OyXXQokvJ2zApSxvd39veRZZnhN+oGe+XNoNwLgkw==", "dev": true, + "license": "MIT", "dependencies": { - "@algolia/client-common": "5.24.0", - "@algolia/requester-browser-xhr": "5.24.0", - "@algolia/requester-fetch": "5.24.0", - "@algolia/requester-node-http": "5.24.0" + "@algolia/client-common": "5.40.0", + "@algolia/requester-browser-xhr": "5.40.0", + "@algolia/requester-fetch": "5.40.0", + "@algolia/requester-node-http": "5.40.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-browser-xhr": { - "version": "5.24.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.24.0.tgz", - "integrity": "sha512-B2Gc+iSxct1WSza5CF6AgfNgmLvVb61d5bqmIWUZixtJIhyAC6lSQZuF+nvt+lmKhQwuY2gYjGGClil8onQvKQ==", + "version": "5.40.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.40.0.tgz", + "integrity": "sha512-MGt94rdHfkrVjfN/KwUfWcnaeohYbWGINrPs96f5J7ZyRYpVLF+VtPQ2FmcddFvK4gnKXSu8BAi81hiIhUpm3w==", "dev": true, + "license": "MIT", "dependencies": { - "@algolia/client-common": "5.24.0" + "@algolia/client-common": "5.40.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-fetch": { - "version": "5.24.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.24.0.tgz", - "integrity": "sha512-6E5+hliqGc5w8ZbyTAQ+C3IGLZ/GiX623Jl2bgHA974RPyFWzVSj4rKqkboUAxQmrFY7Z02ybJWVZS5OhPQocA==", + "version": "5.40.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.40.0.tgz", + "integrity": "sha512-wXQ05JZZ10Dr642QVAkAZ4ZZlU+lh5r6dIBGmm9WElz+1EaQ6BNYtEOTV6pkXuFYsZpeJA89JpDOiwBOP9j24w==", "dev": true, + "license": "MIT", "dependencies": { - "@algolia/client-common": "5.24.0" + "@algolia/client-common": "5.40.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-node-http": { - "version": "5.24.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.24.0.tgz", - "integrity": "sha512-zM+nnqZpiQj20PyAh6uvgdSz+hD7Rj7UfAZwizqNP+bLvcbGXZwABERobuilkCQqyDBBH4uv0yqIcPRl8dSBEg==", + "version": "5.40.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.40.0.tgz", + "integrity": "sha512-5qCRoySnzpbQVg2IPLGFCm4LF75pToxI5tdjOYgUMNL/um91aJ4dH3SVdBEuFlVsalxl8mh3bWPgkUmv6NpJiQ==", "dev": true, + "license": "MIT", "dependencies": { - "@algolia/client-common": "5.24.0" + "@algolia/client-common": "5.40.0" }, "engines": { "node": ">= 14.0.0" @@ -383,6 +333,7 @@ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" @@ -391,16 +342,6 @@ "node": ">=6.0.0" } }, - "node_modules/@ampproject/remapping/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, "node_modules/@antfu/install-pkg": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-1.1.0.tgz", @@ -415,485 +356,238 @@ "url": "https://github.com/sponsors/antfu" } }, + "node_modules/@antfu/install-pkg/node_modules/tinyexec": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.1.tgz", + "integrity": "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==", + "dev": true, + "license": "MIT" + }, "node_modules/@antfu/utils": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-8.1.1.tgz", - "integrity": "sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-9.3.0.tgz", + "integrity": "sha512-9hFT4RauhcUzqOE4f1+frMKLZrgNog5b06I7VmZQV1BkvwvqrbC8EBZf3L1eEL2AKb6rNKjER0sEvJiSP1FXEA==", "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/antfu" } }, - "node_modules/@azure/abort-controller": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz", - "integrity": "sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==", + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "dev": true, + "license": "MIT", "dependencies": { - "tslib": "^2.6.2" + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" }, "engines": { - "node": ">=18.0.0" + "node": ">=6.9.0" } }, - "node_modules/@azure/core-auth": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.9.0.tgz", - "integrity": "sha512-FPwHpZywuyasDSLMqJ6fhbOK3TqUdviZNF8OqRGA4W5Ewib2lEEZ+pBsYcBa88B2NGO/SEnYPGhyBqNlE8ilSw==", + "node_modules/@babel/code-frame/node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true, - "dependencies": { - "@azure/abort-controller": "^2.0.0", - "@azure/core-util": "^1.11.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } + "license": "MIT" }, - "node_modules/@azure/core-client": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@azure/core-client/-/core-client-1.9.4.tgz", - "integrity": "sha512-f7IxTD15Qdux30s2qFARH+JxgwxWLG2Rlr4oSkPGuLWm+1p5y1+C04XGLA0vmX6EtqfutmjvpNmAfgwVIS5hpw==", + "node_modules/@babel/compat-data": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.4.tgz", + "integrity": "sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==", "dev": true, - "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", - "tslib": "^2.6.2" - }, + "license": "MIT", "engines": { - "node": ">=18.0.0" + "node": ">=6.9.0" } }, - "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==", + "node_modules/@babel/core": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz", + "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", "dev": true, + "license": "MIT", "dependencies": { - "@azure/abort-controller": "^2.0.0", - "@azure/core-client": "^1.3.0", - "@azure/core-rest-pipeline": "^1.20.0" + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.4", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.4", + "@babel/types": "^7.28.4", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" }, "engines": { - "node": ">=18.0.0" + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "node_modules/@azure/core-lro": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/@azure/core-lro/-/core-lro-2.7.2.tgz", - "integrity": "sha512-0YIpccoX8m/k00O7mDDMdJpbr6mf1yWo2dfmxt5A8XVZVVMz2SSKaEbMCeJRvgQ0IaSlqhjT47p4hVIRRy90xw==", + "node_modules/@babel/core/node_modules/@babel/traverse": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", + "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", "dev": true, + "license": "MIT", "dependencies": { - "@azure/abort-controller": "^2.0.0", - "@azure/core-util": "^1.2.0", - "@azure/logger": "^1.0.0", - "tslib": "^2.6.2" + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.4", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4", + "debug": "^4.3.1" }, "engines": { - "node": ">=18.0.0" + "node": ">=6.9.0" } }, - "node_modules/@azure/core-paging": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/@azure/core-paging/-/core-paging-1.6.2.tgz", - "integrity": "sha512-YKWi9YuCU04B55h25cnOYZHxXYtEvQEbKST5vqRga7hWY9ydd3FZHdeQF8pyh+acWZvppw13M/LMGx0LABUVMA==", + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/@azure/core-rest-pipeline": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.20.0.tgz", - "integrity": "sha512-ASoP8uqZBS3H/8N8at/XwFr6vYrRP3syTK0EUjDXQy0Y1/AUS+QeIRThKmTNJO2RggvBBxaXDPM7YoIwDGeA0g==", + "node_modules/@babel/generator": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", + "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", "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", - "@typespec/ts-http-runtime": "^0.2.2", - "tslib": "^2.6.2" + "@babel/parser": "^7.28.3", + "@babel/types": "^7.28.2", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=6.9.0" } }, - "node_modules/@azure/core-tracing": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.2.0.tgz", - "integrity": "sha512-UKTiEJPkWcESPYJz3X5uKRYyOcJD+4nYph+KpfdPRnQJVrZfk0KJgdnaAWKfhsBBtAf/D58Az4AvCJEmWgIBAg==", + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", "dev": true, + "license": "MIT", "dependencies": { - "tslib": "^2.6.2" + "@babel/types": "^7.27.3" }, "engines": { - "node": ">=18.0.0" + "node": ">=6.9.0" } }, - "node_modules/@azure/core-util": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.12.0.tgz", - "integrity": "sha512-13IyjTQgABPARvG90+N2dXpC+hwp466XCdQXPCRlbWHgd3SJd5Q1VvaBGv6k1BIa4MQm6hAF1UBU1m8QUxV8sQ==", + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", "dev": true, + "license": "MIT", "dependencies": { - "@azure/abort-controller": "^2.0.0", - "@typespec/ts-http-runtime": "^0.2.2", - "tslib": "^2.6.2" + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" }, "engines": { - "node": ">=18.0.0" + "node": ">=6.9.0" } }, - "node_modules/@azure/identity": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@azure/identity/-/identity-4.9.1.tgz", - "integrity": "sha512-986D7Cf1AOwYqSDtO/FnMAyk/Jc8qpftkGsxuehoh4F85MhQ4fICBGX/44+X1y78lN4Sqib3Bsoaoh/FvOGgmg==", + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, + "license": "ISC", "dependencies": { - "@azure/abort-controller": "^2.0.0", - "@azure/core-auth": "^1.9.0", - "@azure/core-client": "^1.9.2", - "@azure/core-rest-pipeline": "^1.17.0", - "@azure/core-tracing": "^1.0.0", - "@azure/core-util": "^1.11.0", - "@azure/logger": "^1.0.0", - "@azure/msal-browser": "^4.2.0", - "@azure/msal-node": "^3.5.0", - "open": "^10.1.0", - "tslib": "^2.2.0" - }, - "engines": { - "node": ">=18.0.0" + "yallist": "^3.0.2" } }, - "node_modules/@azure/identity/node_modules/define-lazy-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/@azure/identity/node_modules/is-wsl": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", - "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true, - "dependencies": { - "is-inside-container": "^1.0.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "license": "ISC" }, - "node_modules/@azure/identity/node_modules/open": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/open/-/open-10.1.2.tgz", - "integrity": "sha512-cxN6aIDPz6rm8hbebcP7vrQNhvRcveZoJU72Y7vskh4oIm+BZwBECnx5nTmrlres1Qapvx27Qo1Auukpf8PKXw==", + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.3.tgz", + "integrity": "sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==", "dev": true, + "license": "MIT", "dependencies": { - "default-browser": "^5.2.1", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "is-wsl": "^3.1.0" + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.28.3", + "semver": "^6.3.1" }, "engines": { - "node": ">=18" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@azure/keyvault-common": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@azure/keyvault-common/-/keyvault-common-2.0.0.tgz", - "integrity": "sha512-wRLVaroQtOqfg60cxkzUkGKrKMsCP6uYXAOomOIysSMyt1/YM0eUn9LqieAWM8DLcU4+07Fio2YGpPeqUbpP9w==", + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/traverse": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", + "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", "dev": true, + "license": "MIT", "dependencies": { - "@azure/abort-controller": "^2.0.0", - "@azure/core-auth": "^1.3.0", - "@azure/core-client": "^1.5.0", - "@azure/core-rest-pipeline": "^1.8.0", - "@azure/core-tracing": "^1.0.0", - "@azure/core-util": "^1.10.0", - "@azure/logger": "^1.1.4", - "tslib": "^2.2.0" + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.4", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4", + "debug": "^4.3.1" }, "engines": { - "node": ">=18.0.0" + "node": ">=6.9.0" } }, - "node_modules/@azure/keyvault-keys": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/@azure/keyvault-keys/-/keyvault-keys-4.9.0.tgz", - "integrity": "sha512-ZBP07+K4Pj3kS4TF4XdkqFcspWwBHry3vJSOFM5k5ZABvf7JfiMonvaFk2nBF6xjlEbMpz5PE1g45iTMme0raQ==", + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "dependencies": { - "@azure/abort-controller": "^2.0.0", - "@azure/core-auth": "^1.3.0", - "@azure/core-client": "^1.5.0", - "@azure/core-http-compat": "^2.0.1", - "@azure/core-lro": "^2.2.0", - "@azure/core-paging": "^1.1.1", - "@azure/core-rest-pipeline": "^1.8.1", - "@azure/core-tracing": "^1.0.0", - "@azure/core-util": "^1.0.0", - "@azure/keyvault-common": "^2.0.0", - "@azure/logger": "^1.0.0", - "tslib": "^2.2.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@azure/logger": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.2.0.tgz", - "integrity": "sha512-0hKEzLhpw+ZTAfNJyRrn6s+V0nDWzXk9OjBr2TiGIu0OfMr5s2V4FpKLTAK3Ca5r5OKLbf4hkOGDPyiRjie/jA==", - "dev": true, - "dependencies": { - "@typespec/ts-http-runtime": "^0.2.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@azure/msal-browser": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-4.11.1.tgz", - "integrity": "sha512-jPxASelqmP/0R1jZuYW8cboba95M9jpUi2ZqzgftddlAIRZA9KL/YaESuT55zu9+BIPS5Eo2kuhy3q2jjU3whg==", - "dev": true, - "dependencies": { - "@azure/msal-common": "15.5.2" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@azure/msal-common": { - "version": "15.5.2", - "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-15.5.2.tgz", - "integrity": "sha512-+G85T6oA6i4ubzjOw4BpWd8QCG2FunYN4jaz96gw3SUd8+89vwuiqLg6mtnm/lkPC95bayD+CwuwFn9wvhQGow==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@azure/msal-node": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-3.5.2.tgz", - "integrity": "sha512-mt97ieL+IpD/7Hj7Q6pGTPk3dBgvhkOV1HYyH+PkOakhbOOCEb9flAteDgBfADRXBsYJZT+ZlEbPJa4IDn9HZw==", - "dev": true, - "dependencies": { - "@azure/msal-common": "15.5.2", - "jsonwebtoken": "^9.0.0", - "uuid": "^8.3.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/@azure/msal-node/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz", - "integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.0.tgz", - "integrity": "sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.0", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-module-transforms": "^7.27.3", - "@babel/helpers": "^7.27.6", - "@babel/parser": "^7.28.0", - "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.0", - "@babel/types": "^7.28.0", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.0.tgz", - "integrity": "sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.28.0", - "@babel/types": "^7.28.0", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/generator/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.29", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz", - "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", - "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.27.3" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", - "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.27.2", - "@babel/helper-validator-option": "^7.27.1", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.1.tgz", - "integrity": "sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-member-expression-to-functions": "^7.27.1", - "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/traverse": "^7.27.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, "node_modules/@babel/helper-create-regexp-features-plugin": { @@ -901,6 +595,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz", "integrity": "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", "regexpu-core": "^6.2.0", @@ -918,6 +613,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -954,6 +650,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" @@ -967,6 +664,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", "dev": true, + "license": "MIT", "dependencies": { "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" @@ -976,15 +674,15 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz", - "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.27.3" + "@babel/traverse": "^7.28.3" }, "engines": { "node": ">=6.9.0" @@ -993,11 +691,31 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-module-transforms/node_modules/@babel/traverse": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", + "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.4", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-optimise-call-expression": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.27.1" }, @@ -1010,6 +728,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -1019,6 +738,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", "@babel/helper-wrap-function": "^7.27.1", @@ -1036,6 +756,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-member-expression-to-functions": "^7.27.1", "@babel/helper-optimise-call-expression": "^7.27.1", @@ -1053,6 +774,7 @@ "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" @@ -1065,6 +787,7 @@ "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -1073,6 +796,7 @@ "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -1082,45 +806,66 @@ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.27.1.tgz", - "integrity": "sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.3.tgz", + "integrity": "sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/template": "^7.27.1", - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.3", + "@babel/types": "^7.28.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function/node_modules/@babel/traverse": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", + "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.4", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4", + "debug": "^4.3.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.28.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.2.tgz", - "integrity": "sha512-/V9771t+EgXz62aCcyofnQhGM8DQACbRhvzKFsXKC9QM+5MadF8ZmIm0crDMaz3+o0h0zXfJnd4EhbYbxsrcFw==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", "dev": true, "license": "MIT", "dependencies": { "@babel/template": "^7.27.2", - "@babel/types": "^7.28.2" + "@babel/types": "^7.28.4" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz", - "integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", + "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", "license": "MIT", "dependencies": { - "@babel/types": "^7.28.0" + "@babel/types": "^7.28.4" }, "bin": { "parser": "bin/babel-parser.js" @@ -1134,6 +879,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz", "integrity": "sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/traverse": "^7.27.1" @@ -1150,6 +896,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -1165,6 +912,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -1180,6 +928,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", @@ -1193,13 +942,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.27.1.tgz", - "integrity": "sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.3.tgz", + "integrity": "sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/traverse": "^7.28.3" }, "engines": { "node": ">=6.9.0" @@ -1208,11 +958,31 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/node_modules/@babel/traverse": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", + "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.4", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/plugin-proposal-private-property-in-object": { "version": "7.21.0-placeholder-for-preset-env.2", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" }, @@ -1225,6 +995,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz", "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -1240,6 +1011,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -1255,6 +1027,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -1271,6 +1044,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -1299,11 +1073,31 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz", + "node_modules/@babel/plugin-transform-async-generator-functions/node_modules/@babel/traverse": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", + "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.4", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz", "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", @@ -1321,6 +1115,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -1332,9 +1127,9 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.0.tgz", - "integrity": "sha512-gKKnwjpdx5sER/wl0WN0efUBFzF/56YZO0RJrSYP4CljXnP31ByY7fol89AzomdlLNzI36AvOTmYHsnZTCkq8Q==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.4.tgz", + "integrity": "sha512-1yxmvN0MJHOhPVmAsmoW5liWwoILobu/d/ShymZmj867bAdxGbehIrew1DuLpw2Ukv+qDSSPQdYW1dLNE7t11A==", "dev": true, "license": "MIT", "dependencies": { @@ -1352,6 +1147,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz", "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" @@ -1364,12 +1160,13 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.27.1.tgz", - "integrity": "sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.3.tgz", + "integrity": "sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.28.3", "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { @@ -1380,9 +1177,9 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.0.tgz", - "integrity": "sha512-IjM1IoJNw72AZFlj33Cu8X0q2XK/6AaVC3jQu+cgQ5lThWD5ajnuUAml80dqRmOhmPkTH8uAwnpMu9Rvj0LTRA==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.4.tgz", + "integrity": "sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==", "dev": true, "license": "MIT", "dependencies": { @@ -1391,7 +1188,7 @@ "@babel/helper-globals": "^7.28.0", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1", - "@babel/traverse": "^7.28.0" + "@babel/traverse": "^7.28.4" }, "engines": { "node": ">=6.9.0" @@ -1400,11 +1197,31 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-classes/node_modules/@babel/traverse": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", + "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.4", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/plugin-transform-computed-properties": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/template": "^7.27.1" @@ -1433,11 +1250,31 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-destructuring/node_modules/@babel/traverse": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", + "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.4", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/plugin-transform-dotall-regex": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz", "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" @@ -1454,6 +1291,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -1469,6 +1307,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz", "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" @@ -1485,6 +1324,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -1517,6 +1357,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz", "integrity": "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -1532,6 +1373,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -1547,6 +1389,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" @@ -1563,6 +1406,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", @@ -1580,6 +1424,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz", "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -1595,6 +1440,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -1610,6 +1456,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz", "integrity": "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -1625,6 +1472,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -1640,6 +1488,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-module-transforms": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" @@ -1656,6 +1505,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-module-transforms": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" @@ -1672,6 +1522,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz", "integrity": "sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-module-transforms": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", @@ -1690,6 +1541,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-module-transforms": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" @@ -1706,6 +1558,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" @@ -1722,6 +1575,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -1737,6 +1591,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz", "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -1752,6 +1607,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz", "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -1763,9 +1619,9 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.0.tgz", - "integrity": "sha512-9VNGikXxzu5eCiQjdE4IZn8sb9q7Xsk5EXLDBKUYg1e/Tve8/05+KJEtcxGxAgCY5t/BpKQM+JEL/yT4tvgiUA==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.4.tgz", + "integrity": "sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==", "dev": true, "license": "MIT", "dependencies": { @@ -1773,7 +1629,7 @@ "@babel/helper-plugin-utils": "^7.27.1", "@babel/plugin-transform-destructuring": "^7.28.0", "@babel/plugin-transform-parameters": "^7.27.7", - "@babel/traverse": "^7.28.0" + "@babel/traverse": "^7.28.4" }, "engines": { "node": ">=6.9.0" @@ -1782,11 +1638,31 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-object-rest-spread/node_modules/@babel/traverse": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", + "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.4", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/plugin-transform-object-super": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1" @@ -1803,6 +1679,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz", "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -1818,6 +1695,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz", "integrity": "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" @@ -1850,6 +1728,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz", "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" @@ -1866,6 +1745,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz", "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", "@babel/helper-create-class-features-plugin": "^7.27.1", @@ -1883,6 +1763,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -1894,9 +1775,9 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.28.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.1.tgz", - "integrity": "sha512-P0QiV/taaa3kXpLY+sXla5zec4E+4t4Aqc9ggHlfZ7a2cp8/x/Gv08jfwEtn9gnnYIMvHx6aoOZ8XJL8eU71Dg==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.4.tgz", + "integrity": "sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==", "dev": true, "license": "MIT", "dependencies": { @@ -1914,6 +1795,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz", "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" @@ -1930,6 +1812,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -1945,6 +1828,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -1960,6 +1844,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz", "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" @@ -1976,6 +1861,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -1991,6 +1877,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -2006,6 +1893,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -2021,6 +1909,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -2036,6 +1925,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz", "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" @@ -2052,6 +1942,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" @@ -2068,6 +1959,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz", "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" @@ -2080,9 +1972,9 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.0.tgz", - "integrity": "sha512-VmaxeGOwuDqzLl5JUkIRM1X2Qu2uKGxHEQWh+cvvbl7JuJRgKGJSfsEF/bUaxFhJl/XAyxBe7q7qSuTbKFuCyg==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.3.tgz", + "integrity": "sha512-ROiDcM+GbYVPYBOeCR6uBXKkQpBExLl8k9HO1ygXEyds39j+vCCsjmj7S8GOniZQlEs81QlkdJZe76IpLSiqpg==", "dev": true, "license": "MIT", "dependencies": { @@ -2094,7 +1986,7 @@ "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.27.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.3", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-import-assertions": "^7.27.1", "@babel/plugin-syntax-import-attributes": "^7.27.1", @@ -2105,8 +1997,8 @@ "@babel/plugin-transform-block-scoped-functions": "^7.27.1", "@babel/plugin-transform-block-scoping": "^7.28.0", "@babel/plugin-transform-class-properties": "^7.27.1", - "@babel/plugin-transform-class-static-block": "^7.27.1", - "@babel/plugin-transform-classes": "^7.28.0", + "@babel/plugin-transform-class-static-block": "^7.28.3", + "@babel/plugin-transform-classes": "^7.28.3", "@babel/plugin-transform-computed-properties": "^7.27.1", "@babel/plugin-transform-destructuring": "^7.28.0", "@babel/plugin-transform-dotall-regex": "^7.27.1", @@ -2138,7 +2030,7 @@ "@babel/plugin-transform-private-methods": "^7.27.1", "@babel/plugin-transform-private-property-in-object": "^7.27.1", "@babel/plugin-transform-property-literals": "^7.27.1", - "@babel/plugin-transform-regenerator": "^7.28.0", + "@babel/plugin-transform-regenerator": "^7.28.3", "@babel/plugin-transform-regexp-modifiers": "^7.27.1", "@babel/plugin-transform-reserved-words": "^7.27.1", "@babel/plugin-transform-shorthand-properties": "^7.27.1", @@ -2169,6 +2061,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -2178,6 +2071,7 @@ "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/types": "^7.4.4", @@ -2188,9 +2082,11 @@ } }, "node_modules/@babel/runtime": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.1.tgz", - "integrity": "sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", + "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", + "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -2211,28 +2107,38 @@ } }, "node_modules/@babel/traverse": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.0.tgz", - "integrity": "sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==", + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.7.tgz", + "integrity": "sha512-X6ZlfR/O/s5EQ/SnUSLzr+6kGnkg8HXGMzpgsMsrJVcfDtH1vIp6ctCN4eZ1LS5c0+te5Cb6Y514fASjMRJ1nw==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.0", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.0", + "@babel/generator": "^7.27.5", + "@babel/parser": "^7.27.7", "@babel/template": "^7.27.2", - "@babel/types": "^7.28.0", - "debug": "^4.3.1" + "@babel/types": "^7.27.7", + "debug": "^4.3.1", + "globals": "^11.1.0" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/types": { - "version": "7.28.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", - "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", + "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", @@ -2243,61 +2149,37 @@ } }, "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz", + "integrity": "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==", "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@ctrl/tinycolor": { "version": "3.6.1", "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==", + "license": "MIT", "engines": { "node": ">=10" } }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.6.3.tgz", - "integrity": "sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ==", - "dev": true, - "engines": { - "node": ">=14.17.0" - } - }, "node_modules/@docsearch/css": { "version": "3.8.2", "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.8.2.tgz", "integrity": "sha512-y05ayQFyUmCXze79+56v/4HpycYF3uFqB78pLPrSV5ZKAlDuIAAJNhaRi8tTdRNXh05yxX/TyNnzD6LwSM89vQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@docsearch/js": { "version": "3.8.2", "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.8.2.tgz", "integrity": "sha512-Q5wY66qHn0SwA7Taa0aDbHiJvaFJLOJyHmooQ7y8hlwwQLQ/5WwCcoX0g7ii04Qi2DJlHsd0XXzJ8Ypw9+9YmQ==", "dev": true, + "license": "MIT", "dependencies": { "@docsearch/react": "3.8.2", "preact": "^10.0.0" @@ -2308,6 +2190,7 @@ "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.8.2.tgz", "integrity": "sha512-xCRrJQlTt8N9GU0DG4ptwHRkfnSnD/YpdeaXe02iKfqs97TkZJv60yE+1eq/tjPcVnTW8dP5qLP7itifFVV5eg==", "dev": true, + "license": "MIT", "dependencies": { "@algolia/autocomplete-core": "1.17.7", "@algolia/autocomplete-preset-algolia": "1.17.7", @@ -2336,48 +2219,67 @@ } }, "node_modules/@element-plus/icons-vue": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@element-plus/icons-vue/-/icons-vue-2.3.1.tgz", - "integrity": "sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@element-plus/icons-vue/-/icons-vue-2.3.2.tgz", + "integrity": "sha512-OzIuTaIfC8QXEPmJvB4Y4kw34rSXdCJzxcD1kFStBvr8bK6X1zQAYDo0CNMjojnfTqRQCJ0I7prlErcoRiET2A==", + "license": "MIT", "peerDependencies": { "vue": "^3.2.0" } }, "node_modules/@emnapi/core": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.4.3.tgz", - "integrity": "sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.5.0.tgz", + "integrity": "sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg==", "dev": true, + "license": "MIT", "dependencies": { - "@emnapi/wasi-threads": "1.0.2", + "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" } }, "node_modules/@emnapi/runtime": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.3.tgz", - "integrity": "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.5.0.tgz", + "integrity": "sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==", "dev": true, + "license": "MIT", "dependencies": { "tslib": "^2.4.0" } }, "node_modules/@emnapi/wasi-threads": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.2.tgz", - "integrity": "sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", + "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", "dev": true, + "license": "MIT", "dependencies": { "tslib": "^2.4.0" } }, + "node_modules/@envelop/instrumentation": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@envelop/instrumentation/-/instrumentation-1.0.0.tgz", + "integrity": "sha512-cxgkB66RQB95H3X27jlnxCRNTmPuSTgmBAq6/4n2Dtv4hsk4yz8FadA1ggmd0uZzvKqWD6CR+WFgTjhDqg7eyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@whatwg-node/promise-helpers": "^1.2.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.3.tgz", - "integrity": "sha512-W8bFfPA8DowP8l//sxjJLSLkD8iEjMc7cBVyP+u4cEv9sM7mdUCkgsj+t0n/BWPFtv7WWCN5Yzj0N6FJNUUqBQ==", + "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" ], + "license": "MIT", "optional": true, "os": [ "aix" @@ -2387,12 +2289,13 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.3.tgz", - "integrity": "sha512-PuwVXbnP87Tcff5I9ngV0lmiSu40xw1At6i3GsU77U7cjDDB4s0X2cyFuBiDa1SBk9DnvWwnGvVaGBqoFWPb7A==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.10.tgz", + "integrity": "sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==", "cpu": [ "arm" ], + "license": "MIT", "optional": true, "os": [ "android" @@ -2402,12 +2305,13 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.3.tgz", - "integrity": "sha512-XelR6MzjlZuBM4f5z2IQHK6LkK34Cvv6Rj2EntER3lwCBFdg6h2lKbtRjpTTsdEjD/WSe1q8UyPBXP1x3i/wYQ==", + "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" ], + "license": "MIT", "optional": true, "os": [ "android" @@ -2417,12 +2321,13 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.3.tgz", - "integrity": "sha512-ogtTpYHT/g1GWS/zKM0cc/tIebFjm1F9Aw1boQ2Y0eUQ+J89d0jFY//s9ei9jVIlkYi8AfOjiixcLJSGNSOAdQ==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.10.tgz", + "integrity": "sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==", "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ "android" @@ -2432,12 +2337,13 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.3.tgz", - "integrity": "sha512-eESK5yfPNTqpAmDfFWNsOhmIOaQA59tAcF/EfYvo5/QWQCzXn5iUSOnqt3ra3UdzBv073ykTtmeLJZGt3HhA+w==", + "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" ], + "license": "MIT", "optional": true, "os": [ "darwin" @@ -2447,12 +2353,13 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.3.tgz", - "integrity": "sha512-Kd8glo7sIZtwOLcPbW0yLpKmBNWMANZhrC1r6K++uDR2zyzb6AeOYtI6udbtabmQpFaxJ8uduXMAo1gs5ozz8A==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.10.tgz", + "integrity": "sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==", "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ "darwin" @@ -2462,12 +2369,13 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.3.tgz", - "integrity": "sha512-EJiyS70BYybOBpJth3M0KLOus0n+RRMKTYzhYhFeMwp7e/RaajXvP+BWlmEXNk6uk+KAu46j/kaQzr6au+JcIw==", + "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" ], + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -2477,12 +2385,13 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.3.tgz", - "integrity": "sha512-Q+wSjaLpGxYf7zC0kL0nDlhsfuFkoN+EXrx2KSB33RhinWzejOd6AvgmP5JbkgXKmjhmpfgKZq24pneodYqE8Q==", + "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" ], + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -2492,12 +2401,13 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.3.tgz", - "integrity": "sha512-dUOVmAUzuHy2ZOKIHIKHCm58HKzFqd+puLaS424h6I85GlSDRZIA5ycBixb3mFgM0Jdh+ZOSB6KptX30DD8YOQ==", + "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" ], + "license": "MIT", "optional": true, "os": [ "linux" @@ -2507,12 +2417,13 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.3.tgz", - "integrity": "sha512-xCUgnNYhRD5bb1C1nqrDV1PfkwgbswTTBRbAd8aH5PhYzikdf/ddtsYyMXFfGSsb/6t6QaPSzxtbfAZr9uox4A==", + "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" ], + "license": "MIT", "optional": true, "os": [ "linux" @@ -2522,12 +2433,13 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.3.tgz", - "integrity": "sha512-yplPOpczHOO4jTYKmuYuANI3WhvIPSVANGcNUeMlxH4twz/TeXuzEP41tGKNGWJjuMhotpGabeFYGAOU2ummBw==", + "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" ], + "license": "MIT", "optional": true, "os": [ "linux" @@ -2537,12 +2449,13 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.3.tgz", - "integrity": "sha512-P4BLP5/fjyihmXCELRGrLd793q/lBtKMQl8ARGpDxgzgIKJDRJ/u4r1A/HgpBpKpKZelGct2PGI4T+axcedf6g==", + "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" ], + "license": "MIT", "optional": true, "os": [ "linux" @@ -2552,12 +2465,13 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.3.tgz", - "integrity": "sha512-eRAOV2ODpu6P5divMEMa26RRqb2yUoYsuQQOuFUexUoQndm4MdpXXDBbUoKIc0iPa4aCO7gIhtnYomkn2x+bag==", + "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" ], + "license": "MIT", "optional": true, "os": [ "linux" @@ -2567,12 +2481,13 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.3.tgz", - "integrity": "sha512-ZC4jV2p7VbzTlnl8nZKLcBkfzIf4Yad1SJM4ZMKYnJqZFD4rTI+pBG65u8ev4jk3/MPwY9DvGn50wi3uhdaghg==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.10.tgz", + "integrity": "sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==", "cpu": [ "ppc64" ], + "license": "MIT", "optional": true, "os": [ "linux" @@ -2582,12 +2497,13 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.3.tgz", - "integrity": "sha512-LDDODcFzNtECTrUUbVCs6j9/bDVqy7DDRsuIXJg6so+mFksgwG7ZVnTruYi5V+z3eE5y+BJZw7VvUadkbfg7QA==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.10.tgz", + "integrity": "sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==", "cpu": [ "riscv64" ], + "license": "MIT", "optional": true, "os": [ "linux" @@ -2597,12 +2513,13 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.3.tgz", - "integrity": "sha512-s+w/NOY2k0yC2p9SLen+ymflgcpRkvwwa02fqmAwhBRI3SC12uiS10edHHXlVWwfAagYSY5UpmT/zISXPMW3tQ==", + "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" ], + "license": "MIT", "optional": true, "os": [ "linux" @@ -2612,12 +2529,13 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.3.tgz", - "integrity": "sha512-nQHDz4pXjSDC6UfOE1Fw9Q8d6GCAd9KdvMZpfVGWSJztYCarRgSDfOVBY5xwhQXseiyxapkiSJi/5/ja8mRFFA==", + "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" ], + "license": "MIT", "optional": true, "os": [ "linux" @@ -2627,12 +2545,13 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.3.tgz", - "integrity": "sha512-1QaLtOWq0mzK6tzzp0jRN3eccmN3hezey7mhLnzC6oNlJoUJz4nym5ZD7mDnS/LZQgkrhEbEiTn515lPeLpgWA==", + "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" ], + "license": "MIT", "optional": true, "os": [ "netbsd" @@ -2642,12 +2561,13 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.3.tgz", - "integrity": "sha512-i5Hm68HXHdgv8wkrt+10Bc50zM0/eonPb/a/OFVfB6Qvpiirco5gBA5bz7S2SHuU+Y4LWn/zehzNX14Sp4r27g==", + "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" ], + "license": "MIT", "optional": true, "os": [ "netbsd" @@ -2657,12 +2577,13 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.3.tgz", - "integrity": "sha512-zGAVApJEYTbOC6H/3QBr2mq3upG/LBEXr85/pTtKiv2IXcgKV0RT0QA/hSXZqSvLEpXeIxah7LczB4lkiYhTAQ==", + "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" ], + "license": "MIT", "optional": true, "os": [ "openbsd" @@ -2672,12 +2593,13 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.3.tgz", - "integrity": "sha512-fpqctI45NnCIDKBH5AXQBsD0NDPbEFczK98hk/aa6HJxbl+UtLkJV2+Bvy5hLSLk3LHmqt0NTkKNso1A9y1a4w==", + "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" ], + "license": "MIT", "optional": true, "os": [ "openbsd" @@ -2686,13 +2608,30 @@ "node": ">=18" } }, + "node_modules/@esbuild/openharmony-arm64": { + "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" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@esbuild/sunos-x64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.3.tgz", - "integrity": "sha512-ROJhm7d8bk9dMCUZjkS8fgzsPAZEjtRJqCAmVgB0gMrvG7hfmPmz9k1rwO4jSiblFjYmNvbECL9uhaPzONMfgA==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.10.tgz", + "integrity": "sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==", "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ "sunos" @@ -2702,12 +2641,13 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.3.tgz", - "integrity": "sha512-YWcow8peiHpNBiIXHwaswPnAXLsLVygFwCB3A7Bh5jRkIBFWHGmNQ48AlX4xDvQNoMZlPYzjVOQDYEzWCqufMQ==", + "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" ], + "license": "MIT", "optional": true, "os": [ "win32" @@ -2717,12 +2657,13 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.3.tgz", - "integrity": "sha512-qspTZOIGoXVS4DpNqUYUs9UxVb04khS1Degaw/MnfMe7goQ3lTfQ13Vw4qY/Nj0979BGvMRpAYbs/BAxEvU8ew==", + "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" ], + "license": "MIT", "optional": true, "os": [ "win32" @@ -2732,12 +2673,13 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.3.tgz", - "integrity": "sha512-ICgUR+kPimx0vvRzf+N/7L7tVSQeE3BYY+NhHRHXS1kBuPO7z2+7ea2HbhDyZdTephgvNvKrlDDKUexuCVBVvg==", + "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" ], + "license": "MIT", "optional": true, "os": [ "win32" @@ -2747,10 +2689,11 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", - "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", "dev": true, + "license": "MIT", "dependencies": { "eslint-visitor-keys": "^3.4.3" }, @@ -2769,48 +2712,43 @@ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", "dev": true, + "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "node_modules/@eslint/config-array": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", + "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "node_modules/@eslint/config-array/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -2818,213 +2756,254 @@ "node": "*" } }, - "node_modules/@eslint/js": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", - "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "node_modules/@eslint/config-helpers": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.0.tgz", + "integrity": "sha512-WUFvV4WoIwW8Bv0KeKCIIEgdSiFOsulyN0xrMu+7z43q/hkOLXjvb5u7UC9jDxvRzcrbEmuZBX5yJZz1741jog==", "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.16.0" + }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@featherscloud/pinion": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/@featherscloud/pinion/-/pinion-0.5.5.tgz", - "integrity": "sha512-YgjX6DglYgaHmpona0lHfY4t92CiPH9xGowYR/dm2A5bghSx/w83SVnVvV9dqeJruXYAVNhzzmLYcVjUgpTwBA==", + "node_modules/@eslint/core": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.16.0.tgz", + "integrity": "sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "@types/inquirer": "^9.0.7", - "chalk": "^5.3.0", - "commander": "^12.1.0", - "inquirer": "^9.3.2", - "tsx": "^4.19.1" - }, - "bin": { - "pinion": "bin/pinion.js" + "@types/json-schema": "^7.0.15" }, "engines": { - "node": ">= 20" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/daffl" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@feathersjs/adapter-commons": { - "resolved": "packages/adapter-commons", - "link": true - }, - "node_modules/@feathersjs/adapter-tests": { - "resolved": "packages/adapter-tests", - "link": true - }, - "node_modules/@feathersjs/authentication": { - "resolved": "packages/authentication", - "link": true - }, - "node_modules/@feathersjs/authentication-client": { - "resolved": "packages/authentication-client", - "link": true - }, - "node_modules/@feathersjs/authentication-local": { - "resolved": "packages/authentication-local", - "link": true - }, - "node_modules/@feathersjs/authentication-oauth": { - "resolved": "packages/authentication-oauth", - "link": true + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } }, - "node_modules/@feathersjs/cli": { - "resolved": "packages/cli", - "link": true + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } }, - "node_modules/@feathersjs/client": { - "resolved": "packages/client", - "link": true + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } }, - "node_modules/@feathersjs/commons": { - "resolved": "packages/commons", - "link": true + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } }, - "node_modules/@feathersjs/configuration": { - "resolved": "packages/configuration", - "link": true + "node_modules/@eslint/js": { + "version": "9.37.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.37.0.tgz", + "integrity": "sha512-jaS+NJ+hximswBG6pjNX0uEJZkrT0zwpVi3BA3vX22aFGjJjmgSTSmPpZCRKmoBL5VY/M6p0xsSJx7rk7sy5gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } }, - "node_modules/@feathersjs/errors": { - "resolved": "packages/errors", - "link": true + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } }, - "node_modules/@feathersjs/express": { - "resolved": "packages/express", - "link": true + "node_modules/@eslint/plugin-kit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.0.tgz", + "integrity": "sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.16.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } }, - "node_modules/@feathersjs/feathers": { - "resolved": "packages/feathers", - "link": true + "node_modules/@fastify/busboy": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-3.2.0.tgz", + "integrity": "sha512-m9FVDXU3GT2ITSe0UaMA5rU3QkfC/UXtCU8y0gSN/GugTqtVldOBWIB5V6V3sbmenVZUIpU6f+mPEO2+m5iTaA==", + "dev": true, + "license": "MIT" }, - "node_modules/@feathersjs/generators": { - "resolved": "packages/generators", - "link": true + "node_modules/@featherscloud/pinion": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@featherscloud/pinion/-/pinion-0.5.5.tgz", + "integrity": "sha512-YgjX6DglYgaHmpona0lHfY4t92CiPH9xGowYR/dm2A5bghSx/w83SVnVvV9dqeJruXYAVNhzzmLYcVjUgpTwBA==", + "license": "MIT", + "dependencies": { + "@types/inquirer": "^9.0.7", + "chalk": "^5.3.0", + "commander": "^12.1.0", + "inquirer": "^9.3.2", + "tsx": "^4.19.1" + }, + "bin": { + "pinion": "bin/pinion.js" + }, + "engines": { + "node": ">= 20" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/daffl" + } }, - "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==", + "node_modules/@feathersjs/cli": { + "version": "5.0.35", + "resolved": "https://registry.npmjs.org/@feathersjs/cli/-/cli-5.0.35.tgz", + "integrity": "sha512-NCRfd1q65/pSyfvTDWEdCl4VcRSgMBmD0+zAxo/LnFVO27uPZiEKCg5fHFvONzDn+st1s4yj3prVUqkFQbapAA==", + "license": "MIT", + "dependencies": { + "@feathersjs/generators": "^5.0.35", + "chalk": "^5.6.2", + "commander": "^13.1.0" + }, + "bin": { + "feathers": "bin/feathers.js" + }, "engines": { "node": ">= 14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/daffl" } }, - "node_modules/@feathersjs/knex": { - "resolved": "packages/knex", - "link": true - }, - "node_modules/@feathersjs/koa": { - "resolved": "packages/koa", - "link": true - }, - "node_modules/@feathersjs/memory": { - "resolved": "packages/memory", - "link": true - }, - "node_modules/@feathersjs/mongodb": { - "resolved": "packages/mongodb", - "link": true - }, - "node_modules/@feathersjs/rest-client": { - "resolved": "packages/rest-client", - "link": true - }, - "node_modules/@feathersjs/schema": { - "resolved": "packages/schema", - "link": true - }, - "node_modules/@feathersjs/socketio": { - "resolved": "packages/socketio", - "link": true - }, - "node_modules/@feathersjs/socketio-client": { - "resolved": "packages/socketio-client", - "link": true - }, - "node_modules/@feathersjs/tests": { - "resolved": "packages/tests", - "link": true - }, - "node_modules/@feathersjs/transport-commons": { - "resolved": "packages/transport-commons", - "link": true + "node_modules/@feathersjs/cli/node_modules/commander": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", + "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==", + "license": "MIT", + "engines": { + "node": ">=18" + } }, - "node_modules/@feathersjs/typebox": { - "resolved": "packages/typebox", - "link": true + "node_modules/@feathersjs/generators": { + "version": "5.0.35", + "resolved": "https://registry.npmjs.org/@feathersjs/generators/-/generators-5.0.35.tgz", + "integrity": "sha512-QwY8eFYPk1cZtWgh75U2G/5/KqbQcysaB5FBoQjTUK1cABVV0DLVdQs7CxFU63rzlxX9l4RhK144NCUBudLX6A==", + "license": "MIT", + "dependencies": { + "@featherscloud/pinion": "^0.5.5", + "chalk": "^5.6.2", + "lodash": "^4.17.21", + "prettier": "^3.6.2", + "typescript": "^5.9.2" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/daffl" + } }, "node_modules/@floating-ui/core": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.0.tgz", - "integrity": "sha512-FRdBLykrPPA6P76GGGqlex/e7fbe0F1ykgxHYNXQsH/iTEtjMj/f9bpY5oQqbjt5VgZvgz/uKXbGuROijh3VLA==", + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz", + "integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==", + "license": "MIT", "dependencies": { - "@floating-ui/utils": "^0.2.9" + "@floating-ui/utils": "^0.2.10" } }, "node_modules/@floating-ui/dom": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.0.tgz", - "integrity": "sha512-lGTor4VlXcesUMh1cupTUTDoCxMb0V6bm3CnxHzQcw8Eaf1jQbgQX4i02fYgT0vJ82tb5MZ4CZk1LRGkktJCzg==", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.4.tgz", + "integrity": "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==", + "license": "MIT", "dependencies": { - "@floating-ui/core": "^1.7.0", - "@floating-ui/utils": "^0.2.9" + "@floating-ui/core": "^1.7.3", + "@floating-ui/utils": "^0.2.10" } }, "node_modules/@floating-ui/utils": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.9.tgz", - "integrity": "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==" - }, - "node_modules/@gar/promisify": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", - "dev": true - }, - "node_modules/@hapi/bourne": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-3.0.0.tgz", - "integrity": "sha512-Waj1cwPXJDucOib4a3bAISsKJVb15MKi9IvmTI/7ssVEm6sywXGjVJDhl6/umt1pK1ZS7PacXU3A1PmFKHEZ2w==" + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz", + "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", + "license": "MIT" }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", - "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", - "deprecated": "Use @eslint/config-array instead", + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.3", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, + "license": "Apache-2.0", "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "node": ">=18.18.0" } }, - "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "brace-expansion": "^1.1.7" + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" }, "engines": { - "node": "*" + "node": ">=18.18.0" } }, "node_modules/@humanwhocodes/module-importer": { @@ -3032,6 +3011,7 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=12.22" }, @@ -3040,26 +3020,34 @@ "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead", - "dev": true + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } }, "node_modules/@hutson/parse-repository-url": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz", "integrity": "sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=6.9.0" } }, "node_modules/@iconify-json/carbon": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/@iconify-json/carbon/-/carbon-1.2.11.tgz", - "integrity": "sha512-fWcoR0V4dLGLsgUvgjioBcTmj+l8NlMMEP/aMMUwR9PWAr5mCBg52rsTe/bvOnL1zj9PUCNxaj2M4H27GrnO3g==", + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/@iconify-json/carbon/-/carbon-1.2.14.tgz", + "integrity": "sha512-33u6uGiYJ79Dfp72peT+PBMcjxzi+NyJLpqYRX8pnw0zchsUW7Us2xecgvkWgD83KYcbe6hufyWlHFU9y7fb/Q==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3067,10 +3055,11 @@ } }, "node_modules/@iconify-json/simple-icons": { - "version": "1.2.33", - "resolved": "https://registry.npmjs.org/@iconify-json/simple-icons/-/simple-icons-1.2.33.tgz", - "integrity": "sha512-nL5/UmI9x5PQ/AHv6bOaL2pH6twEdEz4pI89efB/K7HFn5etQnxMtGx9DFlOg/sRA2/yFpX8KXvc95CSDv5bJA==", + "version": "1.2.54", + "resolved": "https://registry.npmjs.org/@iconify-json/simple-icons/-/simple-icons-1.2.54.tgz", + "integrity": "sha512-OQQYl8yC5j3QklZOYnK31QYe5h47IhyCoxSLd53f0e0nA4dgi8VOZS30SgSAbsecQ+S0xlGJMjXIHTIqZ+ML3w==", "dev": true, + "license": "CC0-1.0", "dependencies": { "@iconify/types": "*" } @@ -3079,22 +3068,23 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@iconify/utils": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-2.3.0.tgz", - "integrity": "sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA==", + "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": { - "@antfu/install-pkg": "^1.0.0", - "@antfu/utils": "^8.1.0", + "@antfu/install-pkg": "^1.1.0", + "@antfu/utils": "^9.2.0", "@iconify/types": "^2.0.0", - "debug": "^4.4.0", - "globals": "^15.14.0", + "debug": "^4.4.1", + "globals": "^15.15.0", "kolorist": "^1.8.0", - "local-pkg": "^1.0.0", + "local-pkg": "^1.1.1", "mlly": "^1.7.4" } }, @@ -3111,10 +3101,32 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@inquirer/external-editor": { + "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.7.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, "node_modules/@inquirer/figures": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.11.tgz", - "integrity": "sha512-eOg92lvrn/aRUqbxRyvpEWnrvRuTYRifixHkYVpJiygTgVSBIHDqLh0SrMQXkafvULg3ck11V7xvR+zcgvpHFw==", + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.13.tgz", + "integrity": "sha512-lGPVU3yO9ZNqA7vTYz26jny41lE7yoQansmqdMLBEfqaGsmdg7V3W9mK9Pvb5IL4EVZ9GnSDGMO/cJXud5dMaw==", + "license": "MIT", "engines": { "node": ">=18" } @@ -3124,6 +3136,7 @@ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "dev": true, + "license": "ISC", "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", @@ -3137,10 +3150,11 @@ } }, "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -3149,10 +3163,11 @@ } }, "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -3164,13 +3179,15 @@ "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@isaacs/cliui/node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, + "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -3184,10 +3201,11 @@ } }, "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -3203,6 +3221,7 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", @@ -3219,13 +3238,15 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz", "integrity": "sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -3235,6 +3256,7 @@ "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, + "license": "MIT", "dependencies": { "@sinclair/typebox": "^0.27.8" }, @@ -3243,9 +3265,9 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.12", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", - "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "dev": true, "license": "MIT", "dependencies": { @@ -3253,14 +3275,15 @@ "@jridgewell/trace-mapping": "^0.3.24" } }, - "node_modules/@jridgewell/gen-mapping/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" } }, "node_modules/@jridgewell/resolve-uri": { @@ -3268,67 +3291,45 @@ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", - "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25" } }, - "node_modules/@jridgewell/source-map/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "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": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@js-joda/core": { - "version": "5.6.5", - "resolved": "https://registry.npmjs.org/@js-joda/core/-/core-5.6.5.tgz", - "integrity": "sha512-3zwefSMwHpu8iVUW8YYz227sIv6UFqO31p1Bf1ZH/Vom7CmNyUsXjDBlnNzcuhmOL1XfxZ3nvND42kR23XlbcQ==", - "dev": true - }, - "node_modules/@koa/cors": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@koa/cors/-/cors-5.0.0.tgz", - "integrity": "sha512-x/iUDjcS90W69PryLDIMgFyV21YLTnG9zOpPXS7Bkt2b8AsY3zZsIpOLBkYr9fBcF3HbkKaER5hOBZLfpLgYNw==", - "dependencies": { - "vary": "^1.1.2" - }, - "engines": { - "node": ">= 14.0.0" - } - }, "node_modules/@lerna/create": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/@lerna/create/-/create-8.2.2.tgz", - "integrity": "sha512-1yn1MvWn2Yz0SFgTTQnef2m1YedF7KwqLLVIOrGkgQrkVHzsveAIk1A1RcRa2yyUh+siKI1YcJ7lUZIEt+qQ3Q==", + "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": { "@npmcli/arborist": "7.5.4", "@npmcli/package-json": "5.2.0", @@ -3353,7 +3354,6 @@ "get-stream": "6.0.0", "git-url-parse": "14.0.0", "glob-parent": "6.0.2", - "globby": "11.1.0", "graceful-fs": "4.2.11", "has-unicode": "2.0.1", "ini": "^1.3.8", @@ -3364,7 +3364,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", @@ -3388,9 +3387,10 @@ "slash": "^3.0.0", "ssri": "^10.0.6", "string-width": "^4.2.3", - "strong-log-transformer": "2.1.0", "tar": "6.2.1", "temp-dir": "1.0.0", + "through": "2.3.8", + "tinyglobby": "0.2.12", "upath": "2.0.1", "uuid": "^10.0.0", "validate-npm-package-license": "^3.0.4", @@ -3410,6 +3410,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -3421,10 +3422,11 @@ } }, "node_modules/@lerna/create/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -3435,6 +3437,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -3451,63 +3454,23 @@ "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", "dev": true, + "license": "ISC", "engines": { "node": ">= 10" } }, - "node_modules/@lerna/create/node_modules/glob": { - "version": "9.3.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", - "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "minimatch": "^8.0.2", - "minipass": "^4.2.4", - "path-scurry": "^1.6.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@lerna/create/node_modules/glob/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@lerna/create/node_modules/glob/node_modules/minimatch": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", - "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@lerna/create/node_modules/inquirer": { - "version": "8.2.6", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.6.tgz", - "integrity": "sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==", + "version": "8.2.7", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.7.tgz", + "integrity": "sha512-UjOaSel/iddGZJ5xP/Eixh6dY1XghiBw4XK13rCCIJcJfyhhoul/7KhLLUGtebEj6GDYM6Vnx/mVsjx2L/mFIA==", "dev": true, + "license": "MIT", "dependencies": { + "@inquirer/external-editor": "^1.0.0", "ansi-escapes": "^4.2.1", "chalk": "^4.1.1", "cli-cursor": "^3.1.0", "cli-width": "^3.0.0", - "external-editor": "^3.0.3", "figures": "^3.0.0", "lodash": "^4.17.21", "mute-stream": "0.0.8", @@ -3528,6 +3491,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -3544,6 +3508,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -3551,98 +3516,51 @@ "node": "*" } }, - "node_modules/@lerna/create/node_modules/minipass": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", - "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/@lerna/create/node_modules/mute-stream": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/@lerna/create/node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/@lerna/create/node_modules/rimraf": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz", - "integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==", - "dev": true, - "dependencies": { - "glob": "^9.2.0" - }, - "bin": { - "rimraf": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@lerna/create/node_modules/run-async": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.12.0" } }, - "node_modules/@lerna/create/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/@mongodb-js/saslprep": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.2.2.tgz", - "integrity": "sha512-EB0O3SCSNRUFk66iRCpI+cXzIjdswfCs7F6nOC3RAGJ7xr5YhaicvsRwJ9eyzYvYRlCSDUO/c7g4yNulxKC1WA==", - "dependencies": { - "sparse-bitfield": "^3.0.3" - } - }, "node_modules/@napi-rs/wasm-runtime": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.4.tgz", "integrity": "sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==", "dev": true, + "license": "MIT", "dependencies": { "@emnapi/core": "^1.1.0", "@emnapi/runtime": "^1.1.0", "@tybys/wasm-util": "^0.9.0" } }, - "node_modules/@noble/hashes": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", - "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -3656,6 +3574,7 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } @@ -3665,6 +3584,7 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -3678,6 +3598,7 @@ "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-2.2.2.tgz", "integrity": "sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og==", "dev": true, + "license": "ISC", "dependencies": { "agent-base": "^7.1.0", "http-proxy-agent": "^7.0.0", @@ -3694,6 +3615,7 @@ "resolved": "https://registry.npmjs.org/@npmcli/arborist/-/arborist-7.5.4.tgz", "integrity": "sha512-nWtIc6QwwoUORCRNzKx4ypHqCk3drI+5aeYdMTQQiRCcn4lOOgfQh7WyZobGYTxXPSq1VwV53lkpN/BRlRk08g==", "dev": true, + "license": "ISC", "dependencies": { "@isaacs/string-locale-compare": "^1.1.0", "@npmcli/fs": "^3.1.1", @@ -3743,6 +3665,7 @@ "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.1.tgz", "integrity": "sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==", "dev": true, + "license": "ISC", "dependencies": { "semver": "^7.3.5" }, @@ -3755,6 +3678,7 @@ "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-5.0.8.tgz", "integrity": "sha512-liASfw5cqhjNW9UFd+ruwwdEf/lbOAQjLL2XY2dFW/bkJheXDYZgOyul/4gVvEV4BWkTXjYGmDqMw9uegdbJNQ==", "dev": true, + "license": "ISC", "dependencies": { "@npmcli/promise-spawn": "^7.0.0", "ini": "^4.1.3", @@ -3775,6 +3699,7 @@ "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==", "dev": true, + "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -3784,6 +3709,7 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", "dev": true, + "license": "ISC", "engines": { "node": ">=16" } @@ -3793,6 +3719,7 @@ "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^3.1.1" }, @@ -3808,6 +3735,7 @@ "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.1.0.tgz", "integrity": "sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w==", "dev": true, + "license": "ISC", "dependencies": { "npm-bundled": "^3.0.0", "npm-normalize-package-bin": "^3.0.0" @@ -3824,6 +3752,7 @@ "resolved": "https://registry.npmjs.org/@npmcli/map-workspaces/-/map-workspaces-3.0.6.tgz", "integrity": "sha512-tkYs0OYnzQm6iIRdfy+LcLBjcKuQCeE5YLb8KnrIlutJfheNaPvPpgoFEyEFgbjzl5PLZ3IA/BWAwRU0eHuQDA==", "dev": true, + "license": "ISC", "dependencies": { "@npmcli/name-from-folder": "^2.0.0", "glob": "^10.2.2", @@ -3839,6 +3768,7 @@ "resolved": "https://registry.npmjs.org/@npmcli/metavuln-calculator/-/metavuln-calculator-7.1.1.tgz", "integrity": "sha512-Nkxf96V0lAx3HCpVda7Vw4P23RILgdi/5K1fmj2tZkWIYLpXAN8k2UVVOsW16TsS5F8Ws2I7Cm+PU1/rsVF47g==", "dev": true, + "license": "ISC", "dependencies": { "cacache": "^18.0.0", "json-parse-even-better-errors": "^3.0.0", @@ -3850,25 +3780,12 @@ "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/@npmcli/move-file": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", - "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", - "deprecated": "This functionality has been moved to @npmcli/fs", - "dev": true, - "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, "node_modules/@npmcli/name-from-folder": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@npmcli/name-from-folder/-/name-from-folder-2.0.0.tgz", "integrity": "sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg==", "dev": true, + "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -3878,6 +3795,7 @@ "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", "dev": true, + "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -3887,6 +3805,7 @@ "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-5.2.0.tgz", "integrity": "sha512-qe/kiqqkW0AGtvBjL8TJKZk/eBBSpnJkUWvHdQ9jM2lKHXRYYJuyNpJPlJw3c8QjC2ow6NZYiLExhUaeJelbxQ==", "dev": true, + "license": "ISC", "dependencies": { "@npmcli/git": "^5.0.0", "glob": "^10.2.2", @@ -3905,6 +3824,7 @@ "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-7.0.2.tgz", "integrity": "sha512-xhfYPXoV5Dy4UkY0D+v2KkwvnDfiA/8Mt3sWCGI/hM03NsYIH8ZaG6QzS9x7pje5vHZBZJ2v6VRFVTWACnqcmQ==", "dev": true, + "license": "ISC", "dependencies": { "which": "^4.0.0" }, @@ -3917,6 +3837,7 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", "dev": true, + "license": "ISC", "engines": { "node": ">=16" } @@ -3926,6 +3847,7 @@ "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^3.1.1" }, @@ -3941,6 +3863,7 @@ "resolved": "https://registry.npmjs.org/@npmcli/query/-/query-3.1.0.tgz", "integrity": "sha512-C/iR0tk7KSKGldibYIB9x8GtO/0Bd0I2mhOaDb8ucQL/bQVTmGoeREaFj64Z5+iCBRf3dQfed0CjJL7I8iTkiQ==", "dev": true, + "license": "ISC", "dependencies": { "postcss-selector-parser": "^6.0.10" }, @@ -3953,6 +3876,7 @@ "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-2.0.1.tgz", "integrity": "sha512-YgsR5jCQZhVmTJvjduTOIHph0L73pK8xwMVaDY0PatySqVM9AZj93jpoXYSJqfHFxFkN9dmqTw6OiqExsS3LPw==", "dev": true, + "license": "ISC", "engines": { "node": "^16.14.0 || >=18.0.0" } @@ -3962,6 +3886,7 @@ "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-8.1.0.tgz", "integrity": "sha512-y7efHHwghQfk28G2z3tlZ67pLG0XdfYbcVG26r7YIXALRsrVQcTq4/tdenSmdOrEsNahIYA/eh8aEVROWGFUDg==", "dev": true, + "license": "ISC", "dependencies": { "@npmcli/node-gyp": "^3.0.0", "@npmcli/package-json": "^5.0.0", @@ -3979,6 +3904,7 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", "dev": true, + "license": "ISC", "engines": { "node": ">=16" } @@ -3988,6 +3914,7 @@ "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^3.1.1" }, @@ -3999,10 +3926,11 @@ } }, "node_modules/@nx/devkit": { - "version": "20.8.1", - "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-20.8.1.tgz", - "integrity": "sha512-N3nwIg/7RIZeB76iuVo29q+l9WyTtvuBSgDFM2msiIK6Q928ilzoeNPZ/p7w/TE3Gqs5XVhq9ExMvDAOTxdmXA==", + "version": "20.8.2", + "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-20.8.2.tgz", + "integrity": "sha512-rr9p2/tZDQivIpuBUpZaFBK6bZ+b5SAjZk75V4tbCUqGW3+5OPuVvBPm+X+7PYwUF6rwSpewxkjWNeGskfCe+Q==", "dev": true, + "license": "MIT", "dependencies": { "ejs": "^3.1.7", "enquirer": "~2.3.6", @@ -4017,11 +3945,22 @@ "nx": ">= 19 <= 21" } }, + "node_modules/@nx/devkit/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, "node_modules/@nx/devkit/node_modules/minimatch": { "version": "9.0.3", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -4032,23 +3971,15 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@nx/devkit/node_modules/tmp": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", - "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", - "dev": true, - "engines": { - "node": ">=14.14" - } - }, "node_modules/@nx/nx-darwin-arm64": { - "version": "20.8.1", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-20.8.1.tgz", - "integrity": "sha512-Gat4Io66cV70Oa1CjrMJPsEx5ICpAGayv9hejOtBUEDb6XjR12L2e4wV+4EHliF0UbEcuZAr8/lTROEPk0RGWQ==", + "version": "20.8.2", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-20.8.2.tgz", + "integrity": "sha512-t+bmCn6sRPNGU6hnSyWNvbQYA/KgsxGZKYlaCLRwkNhI2akModcBUqtktJzCKd1XHDqs6EkEFBWjFr8/kBEkSg==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -4058,13 +3989,14 @@ } }, "node_modules/@nx/nx-darwin-x64": { - "version": "20.8.1", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-20.8.1.tgz", - "integrity": "sha512-TB9mZk7neGFKgBr2wSBgY6c4kFF9vvChNSp3TrEeXR3FppFcYG5eK4AaKfzWCpYb0wMtseAm7NMX1Lu74utClQ==", + "version": "20.8.2", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-20.8.2.tgz", + "integrity": "sha512-pt/wmDLM31Es8/EzazlyT5U+ou2l60rfMNFGCLqleHEQ0JUTc0KWnOciBLbHIQFiPsCQZJFEKyfV5V/ncePmmw==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -4074,13 +4006,14 @@ } }, "node_modules/@nx/nx-freebsd-x64": { - "version": "20.8.1", - "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-20.8.1.tgz", - "integrity": "sha512-7UQu0/Afna5Af2GagEQ6rbKfUh75NfUn+g66wsoQoUGBvDW0U7B8P3Ph5Bk4Urub0BSfMVcNg2X7CgfypLFN/g==", + "version": "20.8.2", + "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-20.8.2.tgz", + "integrity": "sha512-joZxFbgJfkHkB9uMIJr73Gpnm9pnpvr0XKGbWC409/d2x7q1qK77tKdyhGm+A3+kaZFwstNVPmCUtUwJYyU6LA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -4090,13 +4023,14 @@ } }, "node_modules/@nx/nx-linux-arm-gnueabihf": { - "version": "20.8.1", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-20.8.1.tgz", - "integrity": "sha512-Tjh8JkTP+x1jSrzx+ofx1pKpkhIbXd7bi0bPdpYt6NI1lZz2HB/dv8vtdzP80jXEDztHf0AeGnEJVgJKsgI6yg==", + "version": "20.8.2", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-20.8.2.tgz", + "integrity": "sha512-98O/qsxn4vIMPY/FyzvmVrl7C5yFhCUVk0/4PF+PA2SvtQ051L1eMRY6bq/lb69qfN6szJPZ41PG5mPx0NeLZw==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -4106,13 +4040,14 @@ } }, "node_modules/@nx/nx-linux-arm64-gnu": { - "version": "20.8.1", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-20.8.1.tgz", - "integrity": "sha512-2+qPIwav2vrytH6pe7fukBe8+yN5JGbEDCnDO8wKQsHeeZMLAQJiZ7EJH/+vynRkI7oWf87mihIKNQME19+w6A==", + "version": "20.8.2", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-20.8.2.tgz", + "integrity": "sha512-h6a+HxwfSpxsi4KpxGgPh9GDBmD2E+XqGCdfYpobabxqEBvlnIlJyuDhlRR06cTWpuNXHpRdrVogmV6m/YbtDg==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -4122,13 +4057,14 @@ } }, "node_modules/@nx/nx-linux-arm64-musl": { - "version": "20.8.1", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-20.8.1.tgz", - "integrity": "sha512-DsKc+DiMsuHqpBWchUUUg6zv4OaexRqpFXys6auZlrpFpn80kSqLQ3S4zZ5AUu+26wxZqEVJs+uxHGwFbhEssQ==", + "version": "20.8.2", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-20.8.2.tgz", + "integrity": "sha512-4Ev+jM0VAxDHV/dFgMXjQTCXS4I8W4oMe7FSkXpG8RUn6JK659DC8ExIDPoGIh+Cyqq6r6mw1CSia+ciQWICWQ==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -4138,13 +4074,14 @@ } }, "node_modules/@nx/nx-linux-x64-gnu": { - "version": "20.8.1", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-20.8.1.tgz", - "integrity": "sha512-Kzru44beVKAmSG84ShuMIIfyu2Uu5r8gsHdtiQPBIOGkZa0Z/e6YtUxcN3w1UZ7yvvzoQ4pQLvqU6UZRSWZtEg==", + "version": "20.8.2", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-20.8.2.tgz", + "integrity": "sha512-nR0ev+wxu+nQYRd7bhqggOxK7UfkV6h+Ko1mumUFyrM5GvPpz/ELhjJFSnMcOkOMcvH0b6G5uTBJvN1XWCkbmg==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -4154,13 +4091,14 @@ } }, "node_modules/@nx/nx-linux-x64-musl": { - "version": "20.8.1", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-20.8.1.tgz", - "integrity": "sha512-cSVVb7DVMhrxCaj/n55okBZS6lZoP5a5vynOBGIV4z3/OJLev+xI9A+3imn/aXnBl8iS69HogYyrW0YTXv4Xaw==", + "version": "20.8.2", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-20.8.2.tgz", + "integrity": "sha512-ost41l5yc2aq2Gc9bMMpaPi/jkXqbXEMEPHrxWKuKmaek3K2zbVDQzvBBNcQKxf/mlCsrqN4QO0mKYSRRqag5A==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" @@ -4170,13 +4108,14 @@ } }, "node_modules/@nx/nx-win32-arm64-msvc": { - "version": "20.8.1", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-20.8.1.tgz", - "integrity": "sha512-gte5HcvI24CN6b9I6IYTXh/A0CtRfnlAFaJomPpfT8Wcq637aOZzS0arAEZVoU8QZty1350hj6sfu+wSIjoP7A==", + "version": "20.8.2", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-20.8.2.tgz", + "integrity": "sha512-0SEOqT/daBG5WtM9vOGilrYaAuf1tiALdrFavY62+/arXYxXemUKmRI5qoKDTnvoLMBGkJs6kxhMO5b7aUXIvQ==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -4186,13 +4125,14 @@ } }, "node_modules/@nx/nx-win32-x64-msvc": { - "version": "20.8.1", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-20.8.1.tgz", - "integrity": "sha512-6c2fVEPdPwJdnRbckBatRDF/g6JAp6p3Mfl90DpuaEF2DZC5pmCXKOsXE0aSIZ+gODom2JIchM++2KmDZPJUoA==", + "version": "20.8.2", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-20.8.2.tgz", + "integrity": "sha512-iIsY+tVqes/NOqTbJmggL9Juie/iaDYlWgXA9IUv88FE9thqWKhVj4/tCcPjsOwzD+1SVna3YISEEFsx5UV4ew==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -4206,15 +4146,17 @@ "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz", "integrity": "sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 18" } }, "node_modules/@octokit/core": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.2.1.tgz", - "integrity": "sha512-dKYCMuPO1bmrpuogcjQ8z7ICCH3FP6WmxpwC03yjzGfZhj9fTJg6+bS1+UAplekbN2C+M61UNllGOOoAfGCrdQ==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.2.2.tgz", + "integrity": "sha512-/g2d4sW9nUDJOMz3mabVQvOGhVa4e/BN/Um7yca9Bb2XTzPPnfTWHWQg+IsEYO7M3Vx+EXvaM/I2pJWIMun1bg==", "dev": true, + "license": "MIT", "dependencies": { "@octokit/auth-token": "^4.0.0", "@octokit/graphql": "^7.1.0", @@ -4233,6 +4175,7 @@ "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.6.tgz", "integrity": "sha512-H1fNTMA57HbkFESSt3Y9+FBICv+0jFceJFPWDePYlR/iMGrwM5ph+Dd4XRQs+8X+PUFURLQgX9ChPfhJ/1uNQw==", "dev": true, + "license": "MIT", "dependencies": { "@octokit/types": "^13.1.0", "universal-user-agent": "^6.0.0" @@ -4246,6 +4189,7 @@ "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.1.1.tgz", "integrity": "sha512-3mkDltSfcDUoa176nlGoA32RGjeWjl3K7F/BwHwRMJUW/IteSa4bnSV8p2ThNkcIcZU2umkZWxwETSSCJf2Q7g==", "dev": true, + "license": "MIT", "dependencies": { "@octokit/request": "^8.4.1", "@octokit/types": "^13.0.0", @@ -4259,19 +4203,22 @@ "version": "24.2.0", "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@octokit/plugin-enterprise-rest": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/@octokit/plugin-enterprise-rest/-/plugin-enterprise-rest-6.0.1.tgz", "integrity": "sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@octokit/plugin-paginate-rest": { "version": "11.4.4-cjs.2", "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.4.4-cjs.2.tgz", "integrity": "sha512-2dK6z8fhs8lla5PaOTgqfCGBxgAv/le+EhPs27KklPhm1bKObpu6lXzwfUEQ16ajXzqNrKMujsFyo9K2eaoISw==", "dev": true, + "license": "MIT", "dependencies": { "@octokit/types": "^13.7.0" }, @@ -4287,6 +4234,7 @@ "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-4.0.1.tgz", "integrity": "sha512-GihNqNpGHorUrO7Qa9JbAl0dbLnqJVrV8OXe2Zm5/Y4wFkZQDfTreBzVmiRfJVfE4mClXdihHnbpyyO9FSX4HA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 18" }, @@ -4299,6 +4247,7 @@ "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-13.3.2-cjs.1.tgz", "integrity": "sha512-VUjIjOOvF2oELQmiFpWA1aOPdawpyaCUqcEBc/UOUnj3Xp6DJGrJ1+bjUIIDzdHjnFNO6q57ODMfdEZnoBkCwQ==", "dev": true, + "license": "MIT", "dependencies": { "@octokit/types": "^13.8.0" }, @@ -4314,6 +4263,7 @@ "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.4.1.tgz", "integrity": "sha512-qnB2+SY3hkCmBxZsR/MPCybNmbJe4KAlfWErXq+rBKkQJlbjdJeS85VI9r8UqeLYLvnAenU8Q1okM/0MBsAGXw==", "dev": true, + "license": "MIT", "dependencies": { "@octokit/endpoint": "^9.0.6", "@octokit/request-error": "^5.1.1", @@ -4329,6 +4279,7 @@ "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.1.1.tgz", "integrity": "sha512-v9iyEQJH6ZntoENr9/yXxjuezh4My67CBSu9r6Ve/05Iu5gNgnisNWOsoJHTP6k0Rr0+HQIpnH+kyammu90q/g==", "dev": true, + "license": "MIT", "dependencies": { "@octokit/types": "^13.1.0", "deprecation": "^2.0.0", @@ -4343,6 +4294,7 @@ "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-20.1.2.tgz", "integrity": "sha512-GmYiltypkHHtihFwPRxlaorG5R9VAHuk/vbszVoRTGXnAsY60wYLkh/E2XiFmdZmqrisw+9FaazS1i5SbdWYgA==", "dev": true, + "license": "MIT", "dependencies": { "@octokit/core": "^5.0.2", "@octokit/plugin-paginate-rest": "11.4.4-cjs.2", @@ -4358,408 +4310,64 @@ "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", "dev": true, + "license": "MIT", "dependencies": { "@octokit/openapi-types": "^24.2.0" } }, - "node_modules/@paralleldrive/cuid2": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.2.2.tgz", - "integrity": "sha512-ZOBkgDwEdoYVlSeRbYYXs0S9MejQofiVYoTbKzy/6GQa39/q5tQU2IX46+shYnUkpEl3wc+J6wRlar7r2EK2xA==", - "dependencies": { - "@noble/hashes": "^1.1.5" - } - }, - "node_modules/@parcel/watcher": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", - "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "dev": true, - "hasInstallScript": true, + "license": "MIT", "optional": true, - "dependencies": { - "detect-libc": "^1.0.3", - "is-glob": "^4.0.3", - "micromatch": "^4.0.5", - "node-addon-api": "^7.0.0" - }, "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.5.1", - "@parcel/watcher-darwin-arm64": "2.5.1", - "@parcel/watcher-darwin-x64": "2.5.1", - "@parcel/watcher-freebsd-x64": "2.5.1", - "@parcel/watcher-linux-arm-glibc": "2.5.1", - "@parcel/watcher-linux-arm-musl": "2.5.1", - "@parcel/watcher-linux-arm64-glibc": "2.5.1", - "@parcel/watcher-linux-arm64-musl": "2.5.1", - "@parcel/watcher-linux-x64-glibc": "2.5.1", - "@parcel/watcher-linux-x64-musl": "2.5.1", - "@parcel/watcher-win32-arm64": "2.5.1", - "@parcel/watcher-win32-ia32": "2.5.1", - "@parcel/watcher-win32-x64": "2.5.1" - } - }, - "node_modules/@parcel/watcher-android-arm64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", - "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", - "cpu": [ - "arm64" - ], + "node": ">=14" + } + }, + "node_modules/@pkgr/core": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", + "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", "dev": true, - "optional": true, - "os": [ - "android" - ], + "license": "MIT", "engines": { - "node": ">= 10.0.0" + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "url": "https://opencollective.com/pkgr" } }, - "node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", - "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", - "cpu": [ - "arm64" - ], + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, + "license": "MIT" + }, + "node_modules/@popperjs/core": { + "name": "@sxzz/popperjs-es", + "version": "2.11.7", + "resolved": "https://registry.npmjs.org/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz", + "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==", + "license": "MIT", "funding": { "type": "opencollective", - "url": "https://opencollective.com/parcel" + "url": "https://opencollective.com/popperjs" } }, - "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", - "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", - "cpu": [ - "x64" - ], + "node_modules/@quansync/fs": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@quansync/fs/-/fs-0.1.5.tgz", + "integrity": "sha512-lNS9hL2aS2NZgNW7BBj+6EBl4rOf8l+tQ0eRY6JWCI8jI2kc53gSoqbjojU0OnAWhzoXiOjFyGsHcDGePB3lhA==", "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" + "license": "MIT", + "dependencies": { + "quansync": "^0.2.11" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", - "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", - "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", - "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", - "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", - "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", - "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", - "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", - "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-ia32": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", - "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", - "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@pkgr/core": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.4.tgz", - "integrity": "sha512-ROFF39F6ZrnzSUEmQQZUar0Jt4xVoP9WnDRdWwF4NNcXs3xBTLgBUDoOwW141y1jP+S8nahIbdxbFC7IShw9Iw==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/pkgr" - } - }, - "node_modules/@pnpm/config.env-replace": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", - "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", - "dev": true, - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@pnpm/network.ca-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", - "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", - "dev": true, - "dependencies": { - "graceful-fs": "4.2.10" - }, - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "node_modules/@pnpm/npm-conf": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.3.1.tgz", - "integrity": "sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==", - "dev": true, - "dependencies": { - "@pnpm/config.env-replace": "^1.1.0", - "@pnpm/network.ca-file": "^1.0.1", - "config-chain": "^1.1.11" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@polka/url": { - "version": "1.0.0-next.29", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", - "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", - "dev": true, - "license": "MIT" - }, - "node_modules/@popperjs/core": { - "name": "@sxzz/popperjs-es", - "version": "2.11.7", - "resolved": "https://registry.npmjs.org/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz", - "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, - "node_modules/@quansync/fs": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@quansync/fs/-/fs-0.1.3.tgz", - "integrity": "sha512-G0OnZbMWEs5LhDyqy2UL17vGhSVHkQIfVojMtEWVenvj0V5S84VBgy86kJIuNsGDp2p7sTKlpSIpBUWdC35OKg==", - "dev": true, - "license": "MIT", - "dependencies": { - "quansync": "^0.2.10" - }, - "engines": { - "node": ">=20.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sxzz" + "url": "https://github.com/sponsors/sxzz" } }, "node_modules/@rolldown/pluginutils": { @@ -4774,6 +4382,7 @@ "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.1.tgz", "integrity": "sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA==", "dev": true, + "license": "MIT", "dependencies": { "@rollup/pluginutils": "^5.0.1", "@types/resolve": "1.20.2", @@ -4798,6 +4407,7 @@ "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.4.4.tgz", "integrity": "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==", "dev": true, + "license": "MIT", "dependencies": { "serialize-javascript": "^6.0.1", "smob": "^1.0.0", @@ -4816,10 +4426,11 @@ } }, "node_modules/@rollup/pluginutils": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz", - "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", + "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", @@ -4841,13 +4452,15 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@rollup/pluginutils/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "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" }, @@ -4856,314 +4469,362 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.1.tgz", - "integrity": "sha512-kxz0YeeCrRUHz3zyqvd7n+TVRlNyTifBsmnmNPtk3hQURUyG9eAB+usz6DAwagMusjx/zb3AjvDUvhFGDAexGw==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.4.tgz", + "integrity": "sha512-BTm2qKNnWIQ5auf4deoetINJm2JzvihvGb9R6K/ETwKLql/Bb3Eg2H1FBp1gUb4YGbydMA3jcmQTR73q7J+GAA==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.1.tgz", - "integrity": "sha512-PPkxTOisoNC6TpnDKatjKkjRMsdaWIhyuMkA4UsBXT9WEZY4uHezBTjs6Vl4PbqQQeu6oION1w2voYZv9yquCw==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.4.tgz", + "integrity": "sha512-P9LDQiC5vpgGFgz7GSM6dKPCiqR3XYN1WwJKA4/BUVDjHpYsf3iBEmVz62uyq20NGYbiGPR5cNHI7T1HqxNs2w==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.1.tgz", - "integrity": "sha512-VWXGISWFY18v/0JyNUy4A46KCFCb9NVsH+1100XP31lud+TzlezBbz24CYzbnA4x6w4hx+NYCXDfnvDVO6lcAA==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.4.tgz", + "integrity": "sha512-QRWSW+bVccAvZF6cbNZBJwAehmvG9NwfWHwMy4GbWi/BQIA/laTIktebT2ipVjNncqE6GLPxOok5hsECgAxGZg==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.1.tgz", - "integrity": "sha512-nIwkXafAI1/QCS7pxSpv/ZtFW6TXcNUEHAIA9EIyw5OzxJZQ1YDrX+CL6JAIQgZ33CInl1R6mHet9Y/UZTg2Bw==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.4.tgz", + "integrity": "sha512-hZgP05pResAkRJxL1b+7yxCnXPGsXU0fG9Yfd6dUaoGk+FhdPKCJ5L1Sumyxn8kvw8Qi5PvQ8ulenUbRjzeCTw==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.1.tgz", - "integrity": "sha512-BdrLJ2mHTrIYdaS2I99mriyJfGGenSaP+UwGi1kB9BLOCu9SR8ZpbkmmalKIALnRw24kM7qCN0IOm6L0S44iWw==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.4.tgz", + "integrity": "sha512-xmc30VshuBNUd58Xk4TKAEcRZHaXlV+tCxIXELiE9sQuK3kG8ZFgSPi57UBJt8/ogfhAF5Oz4ZSUBN77weM+mQ==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.1.tgz", - "integrity": "sha512-VXeo/puqvCG8JBPNZXZf5Dqq7BzElNJzHRRw3vjBE27WujdzuOPecDPc/+1DcdcTptNBep3861jNq0mYkT8Z6Q==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.4.tgz", + "integrity": "sha512-WdSLpZFjOEqNZGmHflxyifolwAiZmDQzuOzIq9L27ButpCVpD7KzTRtEG1I0wMPFyiyUdOO+4t8GvrnBLQSwpw==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.1.tgz", - "integrity": "sha512-ehSKrewwsESPt1TgSE/na9nIhWCosfGSFqv7vwEtjyAqZcvbGIg4JAcV7ZEh2tfj/IlfBeZjgOXm35iOOjadcg==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.4.tgz", + "integrity": "sha512-xRiOu9Of1FZ4SxVbB0iEDXc4ddIcjCv2aj03dmW8UrZIW7aIQ9jVJdLBIhxBI+MaTnGAKyvMwPwQnoOEvP7FgQ==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.1.tgz", - "integrity": "sha512-m39iO/aaurh5FVIu/F4/Zsl8xppd76S4qoID8E+dSRQvTyZTOI2gVk3T4oqzfq1PtcvOfAVlwLMK3KRQMaR8lg==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.4.tgz", + "integrity": "sha512-FbhM2p9TJAmEIEhIgzR4soUcsW49e9veAQCziwbR+XWB2zqJ12b4i/+hel9yLiD8pLncDH4fKIPIbt5238341Q==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.1.tgz", - "integrity": "sha512-Y+GHnGaku4aVLSgrT0uWe2o2Rq8te9hi+MwqGF9r9ORgXhmHK5Q71N757u0F8yU1OIwUIFy6YiJtKjtyktk5hg==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.4.tgz", + "integrity": "sha512-4n4gVwhPHR9q/g8lKCyz0yuaD0MvDf7dV4f9tHt0C73Mp8h38UCtSCSE6R9iBlTbXlmA8CjpsZoujhszefqueg==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.1.tgz", - "integrity": "sha512-jEwjn3jCA+tQGswK3aEWcD09/7M5wGwc6+flhva7dsQNRZZTe30vkalgIzV4tjkopsTS9Jd7Y1Bsj6a4lzz8gQ==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.4.tgz", + "integrity": "sha512-u0n17nGA0nvi/11gcZKsjkLj1QIpAuPFQbR48Subo7SmZJnGxDpspyw2kbpuoQnyK+9pwf3pAoEXerJs/8Mi9g==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.1.tgz", - "integrity": "sha512-ySyWikVhNzv+BV/IDCsrraOAZ3UaC8SZB67FZlqVwXwnFhPihOso9rPOxzZbjp81suB1O2Topw+6Ug3JNegejQ==", + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.4.tgz", + "integrity": "sha512-0G2c2lpYtbTuXo8KEJkDkClE/+/2AFPdPAbmaHoE870foRFs4pBrDehilMcrSScrN/fB/1HTaWO4bqw+ewBzMQ==", "cpu": [ "loong64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.1.tgz", - "integrity": "sha512-BvvA64QxZlh7WZWqDPPdt0GH4bznuL6uOO1pmgPnnv86rpUpc8ZxgZwcEgXvo02GRIZX1hQ0j0pAnhwkhwPqWg==", + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.4.tgz", + "integrity": "sha512-teSACug1GyZHmPDv14VNbvZFX779UqWTsd7KtTM9JIZRDI5NUwYSIS30kzI8m06gOPB//jtpqlhmraQ68b5X2g==", "cpu": [ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.1.tgz", - "integrity": "sha512-EQSP+8+1VuSulm9RKSMKitTav89fKbHymTf25n5+Yr6gAPZxYWpj3DzAsQqoaHAk9YX2lwEyAf9S4W8F4l3VBQ==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.4.tgz", + "integrity": "sha512-/MOEW3aHjjs1p4Pw1Xk4+3egRevx8Ji9N6HUIA1Ifh8Q+cg9dremvFCUbOX2Zebz80BwJIgCBUemjqhU5XI5Eg==", "cpu": [ "riscv64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.1.tgz", - "integrity": "sha512-n/vQ4xRZXKuIpqukkMXZt9RWdl+2zgGNx7Uda8NtmLJ06NL8jiHxUawbwC+hdSq1rrw/9CghCpEONor+l1e2gA==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.4.tgz", + "integrity": "sha512-1HHmsRyh845QDpEWzOFtMCph5Ts+9+yllCrREuBR/vg2RogAQGGBRC8lDPrPOMnrdOJ+mt1WLMOC2Kao/UwcvA==", "cpu": [ "riscv64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.1.tgz", - "integrity": "sha512-h8d28xzYb98fMQKUz0w2fMc1XuGzLLjdyxVIbhbil4ELfk5/orZlSTpF/xdI9C8K0I8lCkq+1En2RJsawZekkg==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.4.tgz", + "integrity": "sha512-seoeZp4L/6D1MUyjWkOMRU6/iLmCU2EjbMTyAG4oIOs1/I82Y5lTeaxW0KBfkUdHAWN7j25bpkt0rjnOgAcQcA==", "cpu": [ "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.1.tgz", - "integrity": "sha512-XiK5z70PEFEFqcNj3/zRSz/qX4bp4QIraTy9QjwJAb/Z8GM7kVUsD0Uk8maIPeTyPCP03ChdI+VVmJriKYbRHQ==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.4.tgz", + "integrity": "sha512-Wi6AXf0k0L7E2gteNsNHUs7UMwCIhsCTs6+tqQ5GPwVRWMaflqGec4Sd8n6+FNFDw9vGcReqk2KzBDhCa1DLYg==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.1.tgz", - "integrity": "sha512-2BRORitq5rQ4Da9blVovzNCMaUlyKrzMSvkVR0D4qPuOy/+pMCrh1d7o01RATwVy+6Fa1WBw+da7QPeLWU/1mQ==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.4.tgz", + "integrity": "sha512-dtBZYjDmCQ9hW+WgEkaffvRRCKm767wWhxsFW3Lw86VXz/uJRuD438/XvbZT//B96Vs8oTA8Q4A0AfHbrxP9zw==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.4.tgz", + "integrity": "sha512-1ox+GqgRWqaB1RnyZXL8PD6E5f7YyRUJYnCqKpNzxzP0TkaUh112NDrR9Tt+C8rJ4x5G9Mk8PQR3o7Ku2RKqKA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.1.tgz", - "integrity": "sha512-b2bcNm9Kbde03H+q+Jjw9tSfhYkzrDUf2d5MAd1bOJuVplXvFhWz7tRtWvD8/ORZi7qSCy0idW6tf2HgxSXQSg==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.4.tgz", + "integrity": "sha512-8GKr640PdFNXwzIE0IrkMWUNUomILLkfeHjXBi/nUvFlpZP+FA8BKGKpacjW6OUUHaNI6sUURxR2U2g78FOHWQ==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.1.tgz", - "integrity": "sha512-DfcogW8N7Zg7llVEfpqWMZcaErKfsj9VvmfSyRjCyo4BI3wPEfrzTtJkZG6gKP/Z92wFm6rz2aDO7/JfiR/whA==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.4.tgz", + "integrity": "sha512-AIy/jdJ7WtJ/F6EcfOb2GjR9UweO0n43jNObQMb6oGxkYTfLcnN7vYYpG+CN3lLxrQkzWnMOoNSHTW54pgbVxw==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.4.tgz", + "integrity": "sha512-UF9KfsH9yEam0UjTwAgdK0anlQ7c8/pWPU2yVjyWcF1I1thABt6WXE47cI71pGiZ8wGvxohBoLnxM04L/wj8mQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.1.tgz", - "integrity": "sha512-ECyOuDeH3C1I8jH2MK1RtBJW+YPMvSfT0a5NN0nHfQYnDSJ6tUiZH3gzwVP5/Kfh/+Tt7tpWVF9LXNTnhTJ3kA==", + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.4.tgz", + "integrity": "sha512-bf9PtUa0u8IXDVxzRToFQKsNCRz9qLYfR/MpECxl4mRoWYjAeFjgxj1XdZr2M/GNVpT05p+LgQOHopYDlUu6/w==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@shikijs/core": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-3.9.1.tgz", - "integrity": "sha512-W5Vwen0KJCtR7KFRo+3JLGAqLUPsfW7e+wZ4yaRBGIogwI9ZlnkpRm9ZV8JtfzMxOkIwZwMmmN0hNErLtm3AYg==", + "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.9.1", + "@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.9.1", - "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-3.9.1.tgz", - "integrity": "sha512-4hGenxYpAmtALryKsdli2K58F0s7RBYpj/RSDcAAGfRM6eTEGI5cZnt86mr+d9/4BaZ5sH5s4p3VU5irIdhj9Q==", + "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.9.1", + "@shikijs/types": "3.13.0", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.3.3" } }, "node_modules/@shikijs/engine-oniguruma": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.9.1.tgz", - "integrity": "sha512-WPlL/xqviwS3te4unSGGGfflKsuHLMI6tPdNYvgz/IygcBT6UiwDFSzjBKyebwi5GGSlXsjjdoJLIBnAplmEZw==", + "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.9.1", + "@shikijs/types": "3.13.0", "@shikijs/vscode-textmate": "^10.0.2" } }, "node_modules/@shikijs/langs": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.9.1.tgz", - "integrity": "sha512-Vyy2Yv9PP3Veh3VSsIvNncOR+O93wFsNYgN2B6cCCJlS7H9SKFYc55edsqernsg8WT/zam1cfB6llJsQWLnVhA==", + "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.9.1" + "@shikijs/types": "3.13.0" } }, "node_modules/@shikijs/themes": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.9.1.tgz", - "integrity": "sha512-zAykkGECNICCMXpKeVvq04yqwaSuAIvrf8MjsU5bzskfg4XreU+O0B5wdNCYRixoB9snd3YlZ373WV5E/g5T9A==", + "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.9.1" + "@shikijs/types": "3.13.0" } }, "node_modules/@shikijs/transformers": { @@ -5171,6 +4832,7 @@ "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-2.5.0.tgz", "integrity": "sha512-SI494W5X60CaUwgi8u4q4m4s3YAFSxln3tzNjOSYqq54wlVgz0/NbbXEb3mdLbqMBztcmS7bVTaEd2w0qMmfeg==", "dev": true, + "license": "MIT", "dependencies": { "@shikijs/core": "2.5.0", "@shikijs/types": "2.5.0" @@ -5181,6 +4843,7 @@ "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-2.5.0.tgz", "integrity": "sha512-uu/8RExTKtavlpH7XqnVYBrfBkUc20ngXiX9NSrBhOVZYv/7XQRKUyhtkeflY5QsxC0GbJThCerruZfsUaSldg==", "dev": true, + "license": "MIT", "dependencies": { "@shikijs/engine-javascript": "2.5.0", "@shikijs/engine-oniguruma": "2.5.0", @@ -5195,6 +4858,7 @@ "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-2.5.0.tgz", "integrity": "sha512-VjnOpnQf8WuCEZtNUdjjwGUbtAVKuZkVQ/5cHy/tojVVRIRtlWMYVjyWhxOmIq05AlSOv72z7hRNRGVBgQOl0w==", "dev": true, + "license": "MIT", "dependencies": { "@shikijs/types": "2.5.0", "@shikijs/vscode-textmate": "^10.0.2", @@ -5206,6 +4870,7 @@ "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-2.5.0.tgz", "integrity": "sha512-pGd1wRATzbo/uatrCIILlAdFVKdxImWJGQ5rFiB5VZi2ve5xj3Ax9jny8QvkaV93btQEwR/rSz5ERFpC5mKNIw==", "dev": true, + "license": "MIT", "dependencies": { "@shikijs/types": "2.5.0", "@shikijs/vscode-textmate": "^10.0.2" @@ -5216,6 +4881,7 @@ "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-2.5.0.tgz", "integrity": "sha512-ygl5yhxki9ZLNuNpPitBWvcy9fsSKKaRuO4BAlMyagszQidxcpLAr0qiW/q43DtSIDxO6hEbtYLiFZNXO/hdGw==", "dev": true, + "license": "MIT", "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" @@ -5226,6 +4892,7 @@ "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-3.1.1.tgz", "integrity": "sha512-bUH8SDvPkH3ho3dvwJwfonjlQ4R80vjyvrU8YpxuROddv55vAEJrTuCuCVUhhsHbtlD9tGGbaNApGQckXhS8iQ==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex-xs": "^1.0.0", "regex": "^6.0.1", @@ -5233,9 +4900,9 @@ } }, "node_modules/@shikijs/types": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.9.1.tgz", - "integrity": "sha512-rqM3T7a0iM1oPKz9iaH/cVgNX9Vz1HERcUcXJ94/fulgVdwqfnhXzGxO4bLrAnh/o5CPLy3IcYedogfV+Ns0Qg==", + "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", @@ -5245,13 +4912,15 @@ "node_modules/@shikijs/vscode-textmate": { "version": "10.0.2", "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", - "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==" + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", + "license": "MIT" }, "node_modules/@sigstore/bundle": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-2.3.2.tgz", "integrity": "sha512-wueKWDk70QixNLB363yHc2D2ItTgYiMTdPwK8D9dKQMR3ZQ0c35IxP5xnwQ8cNLoCgCRcHf14kE+CLIvNX1zmA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@sigstore/protobuf-specs": "^0.3.2" }, @@ -5264,6 +4933,7 @@ "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-1.1.0.tgz", "integrity": "sha512-JzBqdVIyqm2FRQCulY6nbQzMpJJpSiJ8XXWMhtOX9eKgaXXpfNOF53lzQEjIydlStnd/eFtuC1dW4VYdD93oRg==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^16.14.0 || >=18.0.0" } @@ -5273,6 +4943,7 @@ "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.3.tgz", "integrity": "sha512-RpacQhBlwpBWd7KEJsRKcBQalbV28fvkxwTOJIqhIuDysMMaJW47V4OqW30iJB9uRpqOSxxEAQFdr8tTattReQ==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^18.17.0 || >=20.5.0" } @@ -5282,6 +4953,7 @@ "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-2.3.2.tgz", "integrity": "sha512-5Vz5dPVuunIIvC5vBb0APwo7qKA4G9yM48kPWJT+OEERs40md5GoUR1yedwpekWZ4m0Hhw44m6zU+ObsON+iDA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@sigstore/bundle": "^2.3.2", "@sigstore/core": "^1.0.0", @@ -5299,6 +4971,7 @@ "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-2.3.4.tgz", "integrity": "sha512-44vtsveTPUpqhm9NCrbU8CWLe3Vck2HO1PNLw7RIajbB7xhtn5RBPm1VNSCMwqGYHhDsBJG8gDF0q4lgydsJvw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@sigstore/protobuf-specs": "^0.3.2", "tuf-js": "^2.2.1" @@ -5312,6 +4985,7 @@ "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-1.2.1.tgz", "integrity": "sha512-8iKx79/F73DKbGfRf7+t4dqrc0bRr0thdPrxAtCKWRm/F0tG71i6O1rvlnScncJLLBZHn3h8M3c1BSUAb9yu8g==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@sigstore/bundle": "^2.3.2", "@sigstore/core": "^1.1.0", @@ -5325,30 +4999,15 @@ "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true - }, - "node_modules/@sindresorhus/is": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", - "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@socket.io/component-emitter": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", - "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==" + "license": "MIT" }, "node_modules/@surma/rollup-plugin-off-main-thread": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "ejs": "^3.1.6", "json5": "^2.2.0", @@ -5361,66 +5020,17 @@ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", "dev": true, + "license": "MIT", "dependencies": { "sourcemap-codec": "^1.4.8" } }, - "node_modules/@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", - "dev": true, - "dependencies": { - "defer-to-connect": "^2.0.1" - }, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/@tediousjs/connection-string": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@tediousjs/connection-string/-/connection-string-0.5.0.tgz", - "integrity": "sha512-7qSgZbincDDDFyRweCIEvZULFAw5iz/DeunhvuxpL31nfntX3P4Yd4HkHBRg9H8CdqY1e5WFN1PZIz/REL9MVQ==", - "dev": true - }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", - "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", - "dev": true - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true - }, "node_modules/@tufjs/canonical-json": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", "integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==", "dev": true, + "license": "MIT", "engines": { "node": "^16.14.0 || >=18.0.0" } @@ -5430,6 +5040,7 @@ "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-2.0.1.tgz", "integrity": "sha512-92F7/SFyufn4DXsha9+QfKnN03JGqtMFMXgSHbZOo8JG59WkTni7UzAouNQDf7AuP9OAMxVOPQcqG3sB7w+kkg==", "dev": true, + "license": "MIT", "dependencies": { "@tufjs/canonical-json": "2.0.0", "minimatch": "^9.0.4" @@ -5443,308 +5054,74 @@ "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz", "integrity": "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==", "dev": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@types/accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/bcryptjs": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/@types/bcryptjs/-/bcryptjs-2.4.6.tgz", - "integrity": "sha512-9xlo6R2qDs5uixm0bcIqCeMCE6HiQsIyel9KQySStiyqNl2tnj2mP3DX1Nf56MD6KMenNNlBBsy3LJ7gUEQPXQ==", - "dev": true - }, - "node_modules/@types/body-parser": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", - "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/co-body": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/@types/co-body/-/co-body-6.1.3.tgz", - "integrity": "sha512-UhuhrQ5hclX6UJctv5m4Rfp52AfG9o9+d9/HwjxhVB5NjXxr5t9oKgJxN8xRHgr35oo8meUEHUPFWiKg6y71aA==", - "dependencies": { - "@types/node": "*", - "@types/qs": "*" - } - }, - "node_modules/@types/compression": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@types/compression/-/compression-1.8.1.tgz", - "integrity": "sha512-kCFuWS0ebDbmxs0AXYn6e2r2nrGAb5KwQhknjSPSPgJcGd8+HVSILlUyFhGqML2gk39HcG7D1ydW9/qpYkN00Q==", "license": "MIT", "dependencies": { - "@types/express": "*", - "@types/node": "*" - } - }, - "node_modules/@types/config": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@types/config/-/config-3.3.5.tgz", - "integrity": "sha512-itq2HtXQBrNUKwMNZnb9mBRE3T99VYCdl1gjST9rq+9kFaB1iMMGuDeZnP88qid73DnpAMKH9ZolqDpS1Lz7+w==" - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "dependencies": { - "@types/node": "*" + "tslib": "^2.4.0" } }, - "node_modules/@types/content-disposition": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.8.tgz", - "integrity": "sha512-QVSSvno3dE0MgO76pJhmv4Qyi/j0Yk9pBp0Y7TJ2Tlj+KCgJWY6qX7nnxCOLkZ3VYRSIk1WTxCvwUSdx6CCLdg==" - }, - "node_modules/@types/cookie-session": { - "version": "2.0.49", - "resolved": "https://registry.npmjs.org/@types/cookie-session/-/cookie-session-2.0.49.tgz", - "integrity": "sha512-4E/bBjlqLhU5l4iGPR+NkVJH593hpNsT4dC3DJDr+ODm6Qpe13kZQVkezRIb+TYDXaBMemS3yLQ+0leba3jlkQ==", + "node_modules/@types/chai": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.2.tgz", + "integrity": "sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==", "dev": true, - "dependencies": { - "@types/express": "*", - "@types/keygrip": "*" - } - }, - "node_modules/@types/cookiejar": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.5.tgz", - "integrity": "sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==" - }, - "node_modules/@types/cookies": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@types/cookies/-/cookies-0.9.0.tgz", - "integrity": "sha512-40Zk8qR147RABiQ7NQnBzWzDcjKzNrntB5BAmeGCb2p/MIyOE+4BVvc17wumsUqUw00bJYqoXFHYygQnEFh4/Q==", - "dependencies": { - "@types/connect": "*", - "@types/express": "*", - "@types/keygrip": "*", - "@types/node": "*" - } - }, - "node_modules/@types/cors": { - "version": "2.8.19", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", - "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", "license": "MIT", "dependencies": { - "@types/node": "*" + "@types/deep-eql": "*" } }, - "node_modules/@types/encodeurl": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@types/encodeurl/-/encodeurl-1.0.3.tgz", - "integrity": "sha512-s10aRcePnVw+iUr5GtTQdzf1GC2jQqkLef2bBUFSX3E52RYnuQ4a7KFHifCFdi4QECiSbyFj7eO9CvZeCnvVkA==", + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", "dev": true, "license": "MIT" }, - "node_modules/@types/eslint": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", - "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", - "dev": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "dev": true, - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, "node_modules/@types/estree": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", - "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", - "dev": true - }, - "node_modules/@types/express": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", - "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@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==", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" }, "node_modules/@types/flexsearch": { - "version": "0.7.42", - "resolved": "https://registry.npmjs.org/@types/flexsearch/-/flexsearch-0.7.42.tgz", - "integrity": "sha512-FdKaw3dPgcCvqU9w8SGgqx8PrxFF2EKySRhEj1nc45HNe/2cBLff3pF52C67hzeUbNhq49t7XRIIibBd41vcIg==", - "deprecated": "This is a stub types definition. flexsearch provides its own type definitions, so you do not need this installed.", + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/@types/flexsearch/-/flexsearch-0.7.6.tgz", + "integrity": "sha512-H5IXcRn96/gaDmo+rDl2aJuIJsob8dgOXDqf8K0t8rWZd1AFNaaspmRsElESiU+EWE33qfbFPgI0OC/B1g9FCA==", "dev": true, - "dependencies": { - "flexsearch": "*" - } - }, - "node_modules/@types/formidable": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/formidable/-/formidable-2.0.6.tgz", - "integrity": "sha512-L4HcrA05IgQyNYJj6kItuIkXrInJvsXTPC5B1i64FggWKKqSL+4hgt7asiSNva75AoLQjq29oPxFfU4GAQ6Z2w==", - "dependencies": { - "@types/node": "*" - } + "license": "MIT" }, "node_modules/@types/hast": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", "dependencies": { "@types/unist": "*" } }, - "node_modules/@types/http-assert": { - "version": "1.5.6", - "resolved": "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.6.tgz", - "integrity": "sha512-TTEwmtjgVbYAzZYWyeHPrrtWnfVkm8tQkP8P21uQifPgMRgjrow3XDEYqucuC8SKZJT7pUnhU/JymvjggxO9vw==" - }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", - "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", - "dev": true - }, - "node_modules/@types/http-errors": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", - "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==" - }, "node_modules/@types/inquirer": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-9.0.7.tgz", - "integrity": "sha512-Q0zyBupO6NxGRZut/JdmqYKOnN95Eg5V8Csg3PGKkP+FnvsUZx1jAyK7fztIszxxMuoBA6E3KXWvdZVXIpx60g==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-9.0.9.tgz", + "integrity": "sha512-/mWx5136gts2Z2e5izdoRCo46lPp5TMs9R15GTSsgg/XnZyxDWVqoVU3R9lWnccKpqwsJLvRoxbCjoJtZB7DSw==", + "license": "MIT", "dependencies": { "@types/through": "*", "rxjs": "^7.2.0" } }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true - }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" - }, - "node_modules/@types/jsonwebtoken": { - "version": "9.0.10", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.10.tgz", - "integrity": "sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==", - "license": "MIT", - "dependencies": { - "@types/ms": "*", - "@types/node": "*" - } - }, - "node_modules/@types/keygrip": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.6.tgz", - "integrity": "sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ==" - }, - "node_modules/@types/koa": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.15.0.tgz", - "integrity": "sha512-7QFsywoE5URbuVnG3loe03QXuGajrnotr3gQkXcEBShORai23MePfFYdhz90FEtBBpkyIYQbVD+evKtloCgX3g==", - "dependencies": { - "@types/accepts": "*", - "@types/content-disposition": "*", - "@types/cookies": "*", - "@types/http-assert": "*", - "@types/http-errors": "*", - "@types/keygrip": "*", - "@types/koa-compose": "*", - "@types/node": "*" - } - }, - "node_modules/@types/koa__cors": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@types/koa__cors/-/koa__cors-5.0.0.tgz", - "integrity": "sha512-LCk/n25Obq5qlernGOK/2LUwa/2YJb2lxHUkkvYFDOpLXlVI6tKcdfCHRBQnOY4LwH6el5WOLs6PD/a8Uzau6g==", - "dependencies": { - "@types/koa": "*" - } - }, - "node_modules/@types/koa-compose": { - "version": "3.2.8", - "resolved": "https://registry.npmjs.org/@types/koa-compose/-/koa-compose-3.2.8.tgz", - "integrity": "sha512-4Olc63RY+MKvxMwVknCUDhRQX1pFQoBZ/lXcRLP69PQkEpze/0cr8LNqJQe5NFb/b19DWi2a5bTi2VAlQzhJuA==", - "dependencies": { - "@types/koa": "*" - } - }, - "node_modules/@types/koa-qs": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/koa-qs/-/koa-qs-2.0.3.tgz", - "integrity": "sha512-HS4oAQaUKUZJPHggg3DeHiuUwSSotieNRuS2ZlUZO14216Fhf7QDNx8mjR/ZwXaSBr/R46KFtE0OAvsF3yP44A==", - "dependencies": { - "@types/koa": "*" - } - }, - "node_modules/@types/koa-send": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@types/koa-send/-/koa-send-4.1.6.tgz", - "integrity": "sha512-vgnNGoOJkx7FrF0Jl6rbK1f8bBecqAchKpXtKuXzqIEdXTDO6dsSTjr+eZ5m7ltSjH4K/E7auNJEQCAd0McUPA==", - "dependencies": { - "@types/koa": "*" - } - }, - "node_modules/@types/koa-session": { - "version": "6.4.5", - "resolved": "https://registry.npmjs.org/@types/koa-session/-/koa-session-6.4.5.tgz", - "integrity": "sha512-Vc6+fslnPuMH2v9y80WYeo39UMo8mweuNNthKCwYU2ZE6l5vnRrzRU3BRvexKwsoI5sxsRl5CxDsBlLI8kY/XA==", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true, - "dependencies": { - "@types/cookies": "*", - "@types/koa": "*" - } - }, - "node_modules/@types/koa-static": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/koa-static/-/koa-static-4.0.4.tgz", - "integrity": "sha512-j1AUzzl7eJYEk9g01hNTlhmipFh8RFbOQmaMNLvLcNNAkPw0bdTs3XTa3V045XFlrWN0QYnblbDJv2RzawTn6A==", - "dependencies": { - "@types/koa": "*", - "@types/koa-send": "*" - } + "license": "MIT" }, "node_modules/@types/linkify-it": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/lodash": { "version": "4.17.20", @@ -5756,6 +5133,7 @@ "version": "4.17.12", "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz", "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", + "license": "MIT", "dependencies": { "@types/lodash": "*" } @@ -5765,6 +5143,7 @@ "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", "dev": true, + "license": "MIT", "dependencies": { "@types/linkify-it": "^5", "@types/mdurl": "^2" @@ -5774,6 +5153,7 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", "dependencies": { "@types/unist": "*" } @@ -5782,82 +5162,38 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", - "dev": true - }, - "node_modules/@types/methods": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@types/methods/-/methods-1.1.4.tgz", - "integrity": "sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==" - }, - "node_modules/@types/mime": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==" + "dev": true, + "license": "MIT" }, "node_modules/@types/minimatch": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", - "dev": true - }, - "node_modules/@types/mocha": { - "version": "10.0.10", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.10.tgz", - "integrity": "sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==", - "dev": true - }, - "node_modules/@types/mongodb": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-4.0.7.tgz", - "integrity": "sha512-lPUYPpzA43baXqnd36cZ9xxorprybxXDzteVKCPAdp14ppHtFJHnXYvNpmBvtMUTb5fKXVv6sVbzo1LHkWhJlw==", - "deprecated": "mongodb provides its own types. @types/mongodb is no longer needed.", "dev": true, - "dependencies": { - "mongodb": "*" - } - }, - "node_modules/@types/ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", - "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==" + "license": "MIT" }, "node_modules/@types/node": { - "version": "24.1.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.1.0.tgz", - "integrity": "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w==", - "license": "MIT", - "dependencies": { - "undici-types": "~7.8.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.7.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.7.1.tgz", + "integrity": "sha512-CmyhGZanP88uuC5GpWU9q+fI61j2SkhO3UGMUdfYRE6Bcy0ccyzn1Rqj9YAB/ZY4kOXmNf0ocah5GtphmLMP6Q==", "license": "MIT", "dependencies": { - "@types/node": "*", - "form-data": "^4.0.4" + "undici-types": "~7.14.0" } }, "node_modules/@types/normalize-package-data": { "version": "2.4.4", "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "dev": true - }, - "node_modules/@types/prettier": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", - "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/qs": { "version": "6.14.0", @@ -5865,239 +5201,196 @@ "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", "license": "MIT" }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" - }, - "node_modules/@types/readable-stream": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-4.0.18.tgz", - "integrity": "sha512-21jK/1j+Wg+7jVw1xnSwy/2Q1VgVjWuFssbYGTREPUBeZ+rqVFl2udq0IkxzPC0ZhOzVceUbyIACFZKLqKEBlA==", - "dev": true, - "dependencies": { - "@types/node": "*", - "safe-buffer": "~5.1.1" - } - }, - "node_modules/@types/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, "node_modules/@types/resolve": { "version": "1.20.2", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/sax": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, - "node_modules/@types/semver-utils": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@types/semver-utils/-/semver-utils-1.1.3.tgz", - "integrity": "sha512-T+YwkslhsM+CeuhYUxyAjWm7mJ5am/K10UX40RuA6k6Lc7eGtq8iY2xOzy7Vq0GOqhl/xZl5l2FwURZMTPTUww==", - "dev": true - }, - "node_modules/@types/send": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", - "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.7", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", - "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", - "dependencies": { - "@types/http-errors": "*", - "@types/node": "*", - "@types/send": "*" - } - }, - "node_modules/@types/superagent": { - "version": "8.1.9", - "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-8.1.9.tgz", - "integrity": "sha512-pTVjI73witn+9ILmoJdajHGW2jkSaOzhiFYF1Rd3EQ94kymLqB9PjD9ISg7WaALC7+dCHT0FGe9T2LktLq/3GQ==", - "dependencies": { - "@types/cookiejar": "^2.1.5", - "@types/methods": "^1.1.4", - "@types/node": "*", - "form-data": "^4.0.0" - } - }, "node_modules/@types/through": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.33.tgz", "integrity": "sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==", + "license": "MIT", "dependencies": { "@types/node": "*" } }, - "node_modules/@types/tough-cookie": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", - "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", - "dev": true - }, "node_modules/@types/trusted-types": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/unist": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", - "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==" - }, - "node_modules/@types/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==", - "dev": true + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" }, "node_modules/@types/web-bluetooth": { "version": "0.0.21", "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz", - "integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==" - }, - "node_modules/@types/webidl-conversions": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", - "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==" - }, - "node_modules/@types/whatwg-url": { - "version": "11.0.5", - "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-11.0.5.tgz", - "integrity": "sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==", - "dependencies": { - "@types/webidl-conversions": "*" - } + "integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==", + "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz", - "integrity": "sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.0.tgz", + "integrity": "sha512-hA8gxBq4ukonVXPy0OKhiaUh/68D0E88GSmtC1iAEnGaieuDi38LhS7jdCHRLi6ErJBNDGCzvh5EnzdPwUc0DA==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.18.0", - "@typescript-eslint/type-utils": "7.18.0", - "@typescript-eslint/utils": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0", + "@typescript-eslint/scope-manager": "8.46.0", + "@typescript-eslint/type-utils": "8.46.0", + "@typescript-eslint/utils": "8.46.0", + "@typescript-eslint/visitor-keys": "8.46.0", "graphemer": "^1.4.0", - "ignore": "^5.3.1", + "ignore": "^7.0.0", "natural-compare": "^1.4.0", - "ts-api-utils": "^1.3.0" + "ts-api-utils": "^2.1.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^7.0.0", - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "@typescript-eslint/parser": "^8.46.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/parser": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.18.0.tgz", - "integrity": "sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.0.tgz", + "integrity": "sha512-n1H6IcDhmmUEG7TNVSspGmiHHutt7iVKtZwRppD7e04wha5MrkV1h3pti9xQLcCMt6YWsncpoT0HMjkH1FNwWQ==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "7.18.0", - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/typescript-estree": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0", + "@typescript-eslint/scope-manager": "8.46.0", + "@typescript-eslint/types": "8.46.0", + "@typescript-eslint/typescript-estree": "8.46.0", + "@typescript-eslint/visitor-keys": "8.46.0", "debug": "^4.3.4" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz", - "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==", + "node_modules/@typescript-eslint/project-service": { + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.0.tgz", + "integrity": "sha512-OEhec0mH+U5Je2NZOeK1AbVCdm0ChyapAyTeXVIYTPXDJ3F07+cu87PPXcGoYqZ7M9YJVvFnfpGg1UmCIqM+QQ==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0" + "@typescript-eslint/tsconfig-utils": "^8.46.0", + "@typescript-eslint/types": "^8.46.0", + "debug": "^4.3.4" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@typescript-eslint/type-utils": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz", - "integrity": "sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.0.tgz", + "integrity": "sha512-lWETPa9XGcBes4jqAMYD9fW0j4n6hrPtTJwWDmtqgFO/4HF4jmdH/Q6wggTw5qIT5TXjKzbt7GsZUBnWoO3dqw==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "7.18.0", - "@typescript-eslint/utils": "7.18.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" + "@typescript-eslint/types": "8.46.0", + "@typescript-eslint/visitor-keys": "8.46.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.0.tgz", + "integrity": "sha512-WrYXKGAHY836/N7zoK/kzi6p8tXFhasHh8ocFL9VZSAkvH956gfeRfcnhs3xzRy8qQ/dq3q44v1jvQieMFg2cw==", + "dev": true, + "license": "MIT", "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.56.0" + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.46.0.tgz", + "integrity": "sha512-hy+lvYV1lZpVs2jRaEYvgCblZxUoJiPyCemwbQZ+NGulWkQRy0HRPYAoef/CNSzaLt+MLvMptZsHXHlkEilaeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.46.0", + "@typescript-eslint/typescript-estree": "8.46.0", + "@typescript-eslint/utils": "8.46.0", + "debug": "^4.3.4", + "ts-api-utils": "^2.1.0" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/types": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", - "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.0.tgz", + "integrity": "sha512-bHGGJyVjSE4dJJIO5yyEWt/cHyNwga/zXGJbJJ8TiO01aVREK6gCTu3L+5wrkb1FbDkQ+TKjMNe9R/QQQP9+rA==", "dev": true, + "license": "MIT", "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -6105,101 +5398,105 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz", - "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.0.tgz", + "integrity": "sha512-ekDCUfVpAKWJbRfm8T1YRrCot1KFxZn21oV76v5Fj4tr7ELyk84OS+ouvYdcDAwZL89WpEkEj2DKQ+qg//+ucg==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0", + "@typescript-eslint/project-service": "8.46.0", + "@typescript-eslint/tsconfig-utils": "8.46.0", + "@typescript-eslint/types": "8.46.0", + "@typescript-eslint/visitor-keys": "8.46.0", "debug": "^4.3.4", - "globby": "^11.1.0", + "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" + "ts-api-utils": "^2.1.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/utils": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz", - "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.0.tgz", + "integrity": "sha512-nD6yGWPj1xiOm4Gk0k6hLSZz2XkNXhuYmyIrOWcHoPuAhjT9i5bAG+xbWPgFeNR8HPHHtpNKdYUXJl/D3x7f5g==", "dev": true, + "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.18.0", - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/typescript-estree": "7.18.0" + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.46.0", + "@typescript-eslint/types": "8.46.0", + "@typescript-eslint/typescript-estree": "8.46.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.56.0" + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz", - "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.0.tgz", + "integrity": "sha512-FrvMpAK+hTbFy7vH5j1+tMYHMSKLE6RzluFJlkFNKD0p9YsUT75JlBSmr5so3QRzvMwU5/bIEdeNrxm8du8l3Q==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.18.0", - "eslint-visitor-keys": "^3.4.3" + "@typescript-eslint/types": "8.46.0", + "eslint-visitor-keys": "^4.2.1" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typespec/ts-http-runtime": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@typespec/ts-http-runtime/-/ts-http-runtime-0.2.2.tgz", - "integrity": "sha512-Gz/Sm64+Sq/vklJu1tt9t+4R2lvnud8NbTD/ZfpZtMiUX7YeVpCA8j6NSW8ptwcoLL+NmYANwqP8DV0q/bwl2w==", + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, - "dependencies": { - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.0", - "tslib": "^2.6.2" - }, + "license": "Apache-2.0", "engines": { - "node": ">=18.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/@ungap/structured-clone": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==" + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "license": "ISC" }, "node_modules/@unocss/astro": { - "version": "66.3.3", - "resolved": "https://registry.npmjs.org/@unocss/astro/-/astro-66.3.3.tgz", - "integrity": "sha512-q26EfadSMmEXZpWDKsJF9anBCfhYDmWljVpDZ2Wo8K48IbZMUXrWfiAiUc6ijE/A/rADfHk8bp3a3GE01t3I9A==", + "version": "66.5.3", + "resolved": "https://registry.npmjs.org/@unocss/astro/-/astro-66.5.3.tgz", + "integrity": "sha512-C4uM6QAtdEtnsAlP5ixtaaMHqSWw7NGCy1Wq17V4BIOPqt1Zq0Nox1blLgcnXSFeoUsyVIGMuCmohJ0oMzzH2w==", "dev": true, "license": "MIT", "dependencies": { - "@unocss/core": "66.3.3", - "@unocss/reset": "66.3.3", - "@unocss/vite": "66.3.3" + "@unocss/core": "66.5.3", + "@unocss/reset": "66.5.3", + "@unocss/vite": "66.5.3" }, "funding": { "url": "https://github.com/sponsors/antfu" @@ -6214,25 +5511,25 @@ } }, "node_modules/@unocss/cli": { - "version": "66.3.3", - "resolved": "https://registry.npmjs.org/@unocss/cli/-/cli-66.3.3.tgz", - "integrity": "sha512-U0HoDcwi/DetqP5zDT3dfxG94pC3TI0PfxmpdTfPY7xEylIdLbV89fb70CvJVysDSQJIuw6TYwqS1ZlHoYNKTA==", + "version": "66.5.3", + "resolved": "https://registry.npmjs.org/@unocss/cli/-/cli-66.5.3.tgz", + "integrity": "sha512-epZCvuCx5LOggB4Hiv+7JSGepmMRS5bi9Tn6YmB90FkFJhrq6F9P024mf3FYgBelKMqX1MVs2Dr2aKiVz7EpRA==", "dev": true, "license": "MIT", "dependencies": { - "@ampproject/remapping": "^2.3.0", - "@unocss/config": "66.3.3", - "@unocss/core": "66.3.3", - "@unocss/preset-uno": "66.3.3", + "@jridgewell/remapping": "^2.3.5", + "@unocss/config": "66.5.3", + "@unocss/core": "66.5.3", + "@unocss/preset-uno": "66.5.3", "cac": "^6.7.14", "chokidar": "^3.6.0", "colorette": "^2.0.20", "consola": "^3.4.2", - "magic-string": "^0.30.17", + "magic-string": "^0.30.19", "pathe": "^2.0.3", "perfect-debounce": "^1.0.0", - "tinyglobby": "^0.2.14", - "unplugin-utils": "^0.2.4" + "tinyglobby": "^0.2.15", + "unplugin-utils": "^0.3.0" }, "bin": { "unocss": "bin/unocss.mjs" @@ -6269,13 +5566,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/@unocss/cli/node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true, - "license": "MIT" - }, "node_modules/@unocss/cli/node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", @@ -6302,15 +5592,63 @@ "node": ">=8.10.0" } }, + "node_modules/@unocss/cli/node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/@unocss/cli/node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/@unocss/cli/node_modules/tinyglobby/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/@unocss/config": { - "version": "66.3.3", - "resolved": "https://registry.npmjs.org/@unocss/config/-/config-66.3.3.tgz", - "integrity": "sha512-D/UxnAmkabapqWU4tF85dWWhNfCUyNutWmd4AD2VsQRZOykufJedLV74r3Z3XhoPJn4IGr3BKZm5/rflf5viDg==", + "version": "66.5.3", + "resolved": "https://registry.npmjs.org/@unocss/config/-/config-66.5.3.tgz", + "integrity": "sha512-3hFmw5V8YOG2y6YHSxg/N/BVH3FKaxFUOMdVa48FB0ACKaTmWuBiJ4jVZuuWsNycuXbTodlFRWT84JxMLIrepQ==", "dev": true, "license": "MIT", "dependencies": { - "@unocss/core": "66.3.3", - "unconfig": "^7.3.2" + "@unocss/core": "66.5.3", + "unconfig": "^7.3.3" }, "engines": { "node": ">=14" @@ -6320,9 +5658,9 @@ } }, "node_modules/@unocss/core": { - "version": "66.3.3", - "resolved": "https://registry.npmjs.org/@unocss/core/-/core-66.3.3.tgz", - "integrity": "sha512-6WFLd92TJelVQARtCGaF+EgEoHKIVe43gkGXVoWILu0HUDRWdhv+cpcyX0RTJV22Y976AxeneU7/zmhAh+CXNg==", + "version": "66.5.3", + "resolved": "https://registry.npmjs.org/@unocss/core/-/core-66.5.3.tgz", + "integrity": "sha512-sGGBgtIfH3Ch7syIzJvA86iIVhSjfGThHBSDA0kFgGTBiYv2VBaUq0UpDfeMpda3LSg59LfEL5Fqa9kUqju5xQ==", "dev": true, "license": "MIT", "funding": { @@ -6330,56 +5668,49 @@ } }, "node_modules/@unocss/extractor-arbitrary-variants": { - "version": "66.3.3", - "resolved": "https://registry.npmjs.org/@unocss/extractor-arbitrary-variants/-/extractor-arbitrary-variants-66.3.3.tgz", - "integrity": "sha512-TXzjH6FcITQ8V2x7ETHgVOlAHf3ll/ysxL+W4fMROm8jP/o7jvsg36tRfOwU0sDGo/qoCPux82ix9e6/JW0oqQ==", + "version": "66.5.3", + "resolved": "https://registry.npmjs.org/@unocss/extractor-arbitrary-variants/-/extractor-arbitrary-variants-66.5.3.tgz", + "integrity": "sha512-QBJCCBFfNOyVlXeDh0h1K2ZvreS5UAbPg+EUPngIIT9hVHIeKatXfCpeMYYt5ZmFZbqX3Zf4MKdguxbGZU9xHQ==", "dev": true, "license": "MIT", "dependencies": { - "@unocss/core": "66.3.3" + "@unocss/core": "66.5.3" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@unocss/inspector": { - "version": "66.3.3", - "resolved": "https://registry.npmjs.org/@unocss/inspector/-/inspector-66.3.3.tgz", - "integrity": "sha512-NsK1WRWez2Mzk4+ophtBdXel8nGaPkIDa9lYSFMdKLF/1jNW23txeEL8CsD6/CK8K0BsR11rhLKhUrzyrjfBSQ==", + "version": "66.5.3", + "resolved": "https://registry.npmjs.org/@unocss/inspector/-/inspector-66.5.3.tgz", + "integrity": "sha512-xe/1zs3mFzhhqNBH5dI6q4DhYCOuyRvdfUUiwUZhvfvZxD66049+/0Hb4Csu+KKp/Ttl0aWu5bkvoyNIRJDBBg==", "dev": true, "license": "MIT", "dependencies": { - "@unocss/core": "66.3.3", - "@unocss/rule-utils": "66.3.3", + "@unocss/core": "66.5.3", + "@unocss/rule-utils": "66.5.3", "colorette": "^2.0.20", "gzip-size": "^6.0.0", - "sirv": "^3.0.1", - "vue-flow-layout": "^0.1.1" + "sirv": "^3.0.2", + "vue-flow-layout": "^0.2.0" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, - "node_modules/@unocss/inspector/node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true, - "license": "MIT" - }, "node_modules/@unocss/postcss": { - "version": "66.3.3", - "resolved": "https://registry.npmjs.org/@unocss/postcss/-/postcss-66.3.3.tgz", - "integrity": "sha512-VKq+BtfPIZbLeAeZFprtKZJAyFBOqA8qpQm+vmWBiBia70JzkwfF2SMNIHiGt022yRo9ZmjnI9uRTxSzqXUsUQ==", + "version": "66.5.3", + "resolved": "https://registry.npmjs.org/@unocss/postcss/-/postcss-66.5.3.tgz", + "integrity": "sha512-DsIzMcEWkU4IlTdOhLVA+tMaNR6Mhtw6XYaEcnA1vWKAdccZn9Bpw4vNh4tphnPB/j6a3FqIBaOZDXncvOUMDQ==", "dev": true, "license": "MIT", "dependencies": { - "@unocss/config": "66.3.3", - "@unocss/core": "66.3.3", - "@unocss/rule-utils": "66.3.3", + "@unocss/config": "66.5.3", + "@unocss/core": "66.5.3", + "@unocss/rule-utils": "66.5.3", "css-tree": "^3.1.0", "postcss": "^8.5.6", - "tinyglobby": "^0.2.14" + "tinyglobby": "^0.2.15" }, "engines": { "node": ">=14" @@ -6391,28 +5722,76 @@ "postcss": "^8.4.21" } }, + "node_modules/@unocss/postcss/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/@unocss/postcss/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/@unocss/postcss/node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, "node_modules/@unocss/preset-attributify": { - "version": "66.3.3", - "resolved": "https://registry.npmjs.org/@unocss/preset-attributify/-/preset-attributify-66.3.3.tgz", - "integrity": "sha512-22+0Cqqu09q+xHfZ3Wk8Coxe5m6PmpgWz4U5xrEC8056UfG3Q1KEqoCxy2wySJIq8SqxQ30Nlll7oMa31B8Krw==", + "version": "66.5.3", + "resolved": "https://registry.npmjs.org/@unocss/preset-attributify/-/preset-attributify-66.5.3.tgz", + "integrity": "sha512-Q7EKBeQuiUspgnPD5K36X66KaRQxmC1rWgIkjnCc2AVfamhe45yuHyPc95jYF8M5p3TxNezrBK/ojHyWEtJbXg==", "dev": true, "license": "MIT", "dependencies": { - "@unocss/core": "66.3.3" + "@unocss/core": "66.5.3" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@unocss/preset-icons": { - "version": "66.3.3", - "resolved": "https://registry.npmjs.org/@unocss/preset-icons/-/preset-icons-66.3.3.tgz", - "integrity": "sha512-Bmhiev05BN/horlgnyZ8gzQWZKd7oVpUBWD66X7U/dgkLdO6B5GIIsdO5Fi7JLeMDmyXm6vlYk0YQhiTbx8l9w==", + "version": "66.5.3", + "resolved": "https://registry.npmjs.org/@unocss/preset-icons/-/preset-icons-66.5.3.tgz", + "integrity": "sha512-HACUwHZBXi9lOU6kNziIMAkNwtMkM57LN1YqLz0UC01rTB+wzO/gQIKEbhZYdAj+Egw9fr9Pt/syxOdFJ3Aa7Q==", "dev": true, "license": "MIT", "dependencies": { - "@iconify/utils": "^2.3.0", - "@unocss/core": "66.3.3", + "@iconify/utils": "^3.0.2", + "@unocss/core": "66.5.3", "ofetch": "^1.4.1" }, "funding": { @@ -6420,67 +5799,66 @@ } }, "node_modules/@unocss/preset-mini": { - "version": "66.3.3", - "resolved": "https://registry.npmjs.org/@unocss/preset-mini/-/preset-mini-66.3.3.tgz", - "integrity": "sha512-pz8rgvHRYS/6fsZNtG7iArLzwANnLy5GkHY/lbuqkWhO2S2Nf7kpJCbR/uV/XeuFsLnYcZW3NLOmelfvZvJamA==", + "version": "66.5.3", + "resolved": "https://registry.npmjs.org/@unocss/preset-mini/-/preset-mini-66.5.3.tgz", + "integrity": "sha512-0WnC4zuyJP3jQQFxFKG7MRUJW5AipdO15yHIkPPWzwNjDSlIcsjhr08v8BJxSFpOsr+XOEgqC3EnHn+CWkv3lg==", "dev": true, "license": "MIT", "dependencies": { - "@unocss/core": "66.3.3", - "@unocss/extractor-arbitrary-variants": "66.3.3", - "@unocss/rule-utils": "66.3.3" + "@unocss/core": "66.5.3", + "@unocss/extractor-arbitrary-variants": "66.5.3", + "@unocss/rule-utils": "66.5.3" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@unocss/preset-tagify": { - "version": "66.3.3", - "resolved": "https://registry.npmjs.org/@unocss/preset-tagify/-/preset-tagify-66.3.3.tgz", - "integrity": "sha512-L1Ez7Y4uBaW+wiv1BOQygpfhseSt3EZ53jqkl7fxl1EKVsJy6SuZgJxlXEHUYp9xYdSp6EHq2CfL8UevaR+loA==", + "version": "66.5.3", + "resolved": "https://registry.npmjs.org/@unocss/preset-tagify/-/preset-tagify-66.5.3.tgz", + "integrity": "sha512-Wqq6LOTz7cJLoDKl2rsQNdzq0/SiEBZud71jUoOGkrh93J24kgly8enxo4VqnKT0Ak5a0gDEAGkOnmQkPJqT7g==", "dev": true, "license": "MIT", "dependencies": { - "@unocss/core": "66.3.3" + "@unocss/core": "66.5.3" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@unocss/preset-typography": { - "version": "66.3.3", - "resolved": "https://registry.npmjs.org/@unocss/preset-typography/-/preset-typography-66.3.3.tgz", - "integrity": "sha512-aQXiGCObvWD9grfUpm0d5nzN+Cpvag0rHP39UjUKb0xSTzY09VzwDrua4kWVO5wJLNK6/L70osyhEgmC3qToxA==", + "version": "66.5.3", + "resolved": "https://registry.npmjs.org/@unocss/preset-typography/-/preset-typography-66.5.3.tgz", + "integrity": "sha512-AZcbcZp4flpK9sFLdLYaYpcIOtfSAkK1f1cywbN/3i2RuvS9CmZpY4xOQjs8Xhws/PQmPO3ZL6b+9Un5DPgb0A==", "dev": true, "license": "MIT", "dependencies": { - "@unocss/core": "66.3.3", - "@unocss/preset-mini": "66.3.3", - "@unocss/rule-utils": "66.3.3" + "@unocss/core": "66.5.3", + "@unocss/rule-utils": "66.5.3" } }, "node_modules/@unocss/preset-uno": { - "version": "66.3.3", - "resolved": "https://registry.npmjs.org/@unocss/preset-uno/-/preset-uno-66.3.3.tgz", - "integrity": "sha512-Tiho4LidpuMHrB19GHTU6XrL0A5eFELHk9ebQ/3WeTy+K/9a6Hn5zsHJe5UCtOsEcUdKB33oZx0hXUp93hb/YQ==", + "version": "66.5.3", + "resolved": "https://registry.npmjs.org/@unocss/preset-uno/-/preset-uno-66.5.3.tgz", + "integrity": "sha512-7YCwlGOLiTNq+xDEJjHtRY3cB5sO6cKT9yytj7tcblAJtN00yLrSj4FP1yxPpbykrT51yY5ZDV20PNJ7JtkiUA==", "dev": true, "license": "MIT", "dependencies": { - "@unocss/core": "66.3.3", - "@unocss/preset-wind3": "66.3.3" + "@unocss/core": "66.5.3", + "@unocss/preset-wind3": "66.5.3" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@unocss/preset-web-fonts": { - "version": "66.3.3", - "resolved": "https://registry.npmjs.org/@unocss/preset-web-fonts/-/preset-web-fonts-66.3.3.tgz", - "integrity": "sha512-ysKZeC7TXxRiqnNL9GxZFGMKFAHXrcaqozPaEOIJ40dvzbJt8IMLyFndZkcFMcgDCV0pFh/y37mGxxxARO9+pQ==", + "version": "66.5.3", + "resolved": "https://registry.npmjs.org/@unocss/preset-web-fonts/-/preset-web-fonts-66.5.3.tgz", + "integrity": "sha512-frgl2zQEyHWg5LGwkFg8HH3d4py4tGYdl9OR7XpR19L5Yj/xapRqz/JZDcGzF4nhdxAlhC4V/6p30hycc7y2Xg==", "dev": true, "license": "MIT", "dependencies": { - "@unocss/core": "66.3.3", + "@unocss/core": "66.5.3", "ofetch": "^1.4.1" }, "funding": { @@ -6488,53 +5866,53 @@ } }, "node_modules/@unocss/preset-wind": { - "version": "66.3.3", - "resolved": "https://registry.npmjs.org/@unocss/preset-wind/-/preset-wind-66.3.3.tgz", - "integrity": "sha512-3Mxl/TDPcv8nNKdFe3WKdlXE6de+lCaaizEH86BILW3ZeyPU9aKzWcZIoxohla0a6zMxDQ2+Gf+7EwaOvpqo7Q==", + "version": "66.5.3", + "resolved": "https://registry.npmjs.org/@unocss/preset-wind/-/preset-wind-66.5.3.tgz", + "integrity": "sha512-o4U75F+0AOwBBGABbaqD2H9QrCIyobygTEJXHs5uhtTrjszzQEFP9VkJJPuoxRpJ56wIlyqRI7Z7iAFRgEvFOg==", "dev": true, "license": "MIT", "dependencies": { - "@unocss/core": "66.3.3", - "@unocss/preset-wind3": "66.3.3" + "@unocss/core": "66.5.3", + "@unocss/preset-wind3": "66.5.3" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@unocss/preset-wind3": { - "version": "66.3.3", - "resolved": "https://registry.npmjs.org/@unocss/preset-wind3/-/preset-wind3-66.3.3.tgz", - "integrity": "sha512-iXmjvPqvmPTo4z7epQDqHxzlGRsbLJEgfETqTrRJeagvFG7Gs+ajS8cQhbf6wL01dSRHjvhVXi3MsIvqfHHXOw==", + "version": "66.5.3", + "resolved": "https://registry.npmjs.org/@unocss/preset-wind3/-/preset-wind3-66.5.3.tgz", + "integrity": "sha512-AEgidZkpdCFKjXmCUSJgucxz/IqT4atLUQiq8x8fEKSuPo8rH2CtmO4Bllt9uJMS3GrGNqyrtPixjz5mknC0ZQ==", "dev": true, "license": "MIT", "dependencies": { - "@unocss/core": "66.3.3", - "@unocss/preset-mini": "66.3.3", - "@unocss/rule-utils": "66.3.3" + "@unocss/core": "66.5.3", + "@unocss/preset-mini": "66.5.3", + "@unocss/rule-utils": "66.5.3" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@unocss/preset-wind4": { - "version": "66.3.3", - "resolved": "https://registry.npmjs.org/@unocss/preset-wind4/-/preset-wind4-66.3.3.tgz", - "integrity": "sha512-JSJTXVJel6kX+u4Ktt6JGnukYWYhKxmjgORTwclUpokRHgEoD+xsh0Rz4YGJ1fWSnzNslNQhWP9yDRByVPHWwA==", + "version": "66.5.3", + "resolved": "https://registry.npmjs.org/@unocss/preset-wind4/-/preset-wind4-66.5.3.tgz", + "integrity": "sha512-EGVtwNgHbdvTMX1Fnpa9l2FWxfAkMdpGxe5xL2MjC7+WVFqVqBCIF37ejiOLgi8+rr1omAijuvh3hGP7VdSPiQ==", "dev": true, "license": "MIT", "dependencies": { - "@unocss/core": "66.3.3", - "@unocss/extractor-arbitrary-variants": "66.3.3", - "@unocss/rule-utils": "66.3.3" + "@unocss/core": "66.5.3", + "@unocss/extractor-arbitrary-variants": "66.5.3", + "@unocss/rule-utils": "66.5.3" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@unocss/reset": { - "version": "66.3.3", - "resolved": "https://registry.npmjs.org/@unocss/reset/-/reset-66.3.3.tgz", - "integrity": "sha512-VIeR/mIcCL89/1uA1KM1QCYca4aeIGqEHMTJL1nCD4v+7wk6XhNXhsp5gMIHo+V804SUSmATWaeHTiKpiFu7AQ==", + "version": "66.5.3", + "resolved": "https://registry.npmjs.org/@unocss/reset/-/reset-66.5.3.tgz", + "integrity": "sha512-z9VOurNlr3nJQcCbTL13a6KcQ2aQo/ikHDdGZwPzLYtqGAwHvsq1nXFswkJc+XWD7V5q1mjmGEKLBqXFIokMpw==", "dev": true, "license": "MIT", "funding": { @@ -6542,14 +5920,14 @@ } }, "node_modules/@unocss/rule-utils": { - "version": "66.3.3", - "resolved": "https://registry.npmjs.org/@unocss/rule-utils/-/rule-utils-66.3.3.tgz", - "integrity": "sha512-QKgVGV5nRRnK44/reUKFLAc5UGyl98vz3hrfk8JI8pVza58vmQWTdAB2rIpNJ5a5j+EkWfDOUlGQaOrIeYGLdg==", + "version": "66.5.3", + "resolved": "https://registry.npmjs.org/@unocss/rule-utils/-/rule-utils-66.5.3.tgz", + "integrity": "sha512-3aDxWw3fBjA2hldu5r126Dxl10nP/1dEx+fetiWEGT6X4J9dvJgNAGAJOVZeKv6tSfhqLyFsRV/cSbApYItCYw==", "dev": true, "license": "MIT", "dependencies": { - "@unocss/core": "^66.3.3", - "magic-string": "^0.30.17" + "@unocss/core": "^66.5.3", + "magic-string": "^0.30.19" }, "engines": { "node": ">=14" @@ -6559,72 +5937,90 @@ } }, "node_modules/@unocss/transformer-attributify-jsx": { - "version": "66.3.3", - "resolved": "https://registry.npmjs.org/@unocss/transformer-attributify-jsx/-/transformer-attributify-jsx-66.3.3.tgz", - "integrity": "sha512-ENNYFk5wrI4jlxn0tWGeR9QGxflAfZue3X2ABg0KSVOiYyIOsrHqtdoiLYkuCA9idRlBZPQxePJKcPWt1r/tYA==", + "version": "66.5.3", + "resolved": "https://registry.npmjs.org/@unocss/transformer-attributify-jsx/-/transformer-attributify-jsx-66.5.3.tgz", + "integrity": "sha512-Rc9Hiwn1DAMjxpjn5TMjU4jh+Ufzy6wMsj4wYseU9vf+jIf7h3OotJWUnmNg77ve458Q6RC9HkeAqkU0rmVIwQ==", "dev": true, "license": "MIT", "dependencies": { - "@unocss/core": "66.3.3" + "@babel/parser": "7.27.7", + "@babel/traverse": "7.27.7", + "@unocss/core": "66.5.3" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, + "node_modules/@unocss/transformer-attributify-jsx/node_modules/@babel/parser": { + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.7.tgz", + "integrity": "sha512-qnzXzDXdr/po3bOTbTIQZ7+TxNKxpkN5IifVLXS+r7qwynkZfPyjZfE7hCXbo7IoO9TNcSyibgONsf2HauUd3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.7" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@unocss/transformer-compile-class": { - "version": "66.3.3", - "resolved": "https://registry.npmjs.org/@unocss/transformer-compile-class/-/transformer-compile-class-66.3.3.tgz", - "integrity": "sha512-VTEFuwp3iajGWyEFwmO5LRvOjgZM1TK+4rX5Q79xyTAPkLAKgOa03Ne8+kU8oG0TQEa4mXVw6ul9McM7UBJh1w==", + "version": "66.5.3", + "resolved": "https://registry.npmjs.org/@unocss/transformer-compile-class/-/transformer-compile-class-66.5.3.tgz", + "integrity": "sha512-Aqj90zhS/JckHz2p4OhoqL1p8teiiygkFA2DKcbtCdEpvAjKe2NMR/OFTn9kr1ubq0C9a2fKdVe6sV5sdCjIRw==", "dev": true, "license": "MIT", "dependencies": { - "@unocss/core": "66.3.3" + "@unocss/core": "66.5.3" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@unocss/transformer-directives": { - "version": "66.3.3", - "resolved": "https://registry.npmjs.org/@unocss/transformer-directives/-/transformer-directives-66.3.3.tgz", - "integrity": "sha512-11T7fmYk/XZcqFDn4qiIvs04mJhUtAoha5Y99bVE+L3byWa6BT4jb5aSAKk+24q5aynwgB++4RgfQxarj69WTw==", + "version": "66.5.3", + "resolved": "https://registry.npmjs.org/@unocss/transformer-directives/-/transformer-directives-66.5.3.tgz", + "integrity": "sha512-c09Cztk+UlA/JhMzPqrp0HKZ/VfbQ3mDSHbIaEBySIt7hbi/9YJmSQCaL0d+CWtKZtCqjxN4qmefHiDl8q6OAQ==", "dev": true, "license": "MIT", "dependencies": { - "@unocss/core": "66.3.3", - "@unocss/rule-utils": "66.3.3", + "@unocss/core": "66.5.3", + "@unocss/rule-utils": "66.5.3", "css-tree": "^3.1.0" } }, "node_modules/@unocss/transformer-variant-group": { - "version": "66.3.3", - "resolved": "https://registry.npmjs.org/@unocss/transformer-variant-group/-/transformer-variant-group-66.3.3.tgz", - "integrity": "sha512-uhK81pbJfXJFYaXxOoIFVEG8/Kx1iaAkTwRB6c+WNUfl9GiKyYQcrI7bETgCPPbg230Z68jVICBgBATeLJ31vQ==", + "version": "66.5.3", + "resolved": "https://registry.npmjs.org/@unocss/transformer-variant-group/-/transformer-variant-group-66.5.3.tgz", + "integrity": "sha512-Ra0rWV8kycrpQLS5yKiRRcJwnyYff1Jpmyt4PJcVg1txpvoGuCEDeGnMluGbIPVkLQ/6/Ml2NO0T61Jarf1ouQ==", "dev": true, "license": "MIT", "dependencies": { - "@unocss/core": "66.3.3" + "@unocss/core": "66.5.3" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/@unocss/vite": { - "version": "66.3.3", - "resolved": "https://registry.npmjs.org/@unocss/vite/-/vite-66.3.3.tgz", - "integrity": "sha512-uu3smeEW6q36ri6vydRx2GiTGF5O/J80Fr4GLmLiwfpt2YnPHraO7XHVR5/mwG2Oz5Kov0uGvxVsdgxZABKRgw==", + "version": "66.5.3", + "resolved": "https://registry.npmjs.org/@unocss/vite/-/vite-66.5.3.tgz", + "integrity": "sha512-+RfDyHXxryJpIz/zaayFxuxmUCILrCWkgyZ05Yi7Oy6/BodDB/EV+1yJpFb+IVfMFn74dVULe+gKeLUP9p4pDQ==", "dev": true, "license": "MIT", "dependencies": { - "@ampproject/remapping": "^2.3.0", - "@unocss/config": "66.3.3", - "@unocss/core": "66.3.3", - "@unocss/inspector": "66.3.3", + "@jridgewell/remapping": "^2.3.5", + "@unocss/config": "66.5.3", + "@unocss/core": "66.5.3", + "@unocss/inspector": "66.5.3", "chokidar": "^3.6.0", - "magic-string": "^0.30.17", + "magic-string": "^0.30.19", "pathe": "^2.0.3", - "tinyglobby": "^0.2.14", - "unplugin-utils": "^0.2.4" + "tinyglobby": "^0.2.15", + "unplugin-utils": "^0.3.0" }, "funding": { "url": "https://github.com/sponsors/antfu" @@ -6684,177 +6080,383 @@ "node": ">=8.10.0" } }, - "node_modules/@vitejs/plugin-vue": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.3.tgz", - "integrity": "sha512-IYSLEQj4LgZZuoVpdSUCw3dIynTWQgPlaRP6iAvMle4My0HdYwr5g5wQAfwOeHQBmYwEkqF70nRpSilr6PoUDg==", + "node_modules/@unocss/vite/node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": ">=12.0.0" }, - "peerDependencies": { - "vite": "^5.0.0 || ^6.0.0", - "vue": "^3.2.25" + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/@vue/compiler-core": { - "version": "3.5.18", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.18.tgz", - "integrity": "sha512-3slwjQrrV1TO8MoXgy3aynDQ7lslj5UqDxuHnrzHtpON5CBinhWjJETciPngpin/T3OuW3tXUf86tEurusnztw==", + "node_modules/@unocss/vite/node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, "license": "MIT", - "dependencies": { - "@babel/parser": "^7.28.0", - "@vue/shared": "3.5.18", - "entities": "^4.5.0", - "estree-walker": "^2.0.2", - "source-map-js": "^1.2.1" + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } } }, - "node_modules/@vue/compiler-core/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "license": "MIT" - }, - "node_modules/@vue/compiler-dom": { - "version": "3.5.18", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.18.tgz", - "integrity": "sha512-RMbU6NTU70++B1JyVJbNbeFkK+A+Q7y9XKE2EM4NLGm2WFR8x9MbAtWxPPLdm0wUkuZv9trpwfSlL6tjdIa1+A==", + "node_modules/@unocss/vite/node_modules/tinyglobby/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", - "dependencies": { - "@vue/compiler-core": "3.5.18", - "@vue/shared": "3.5.18" + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/@vue/compiler-sfc": { - "version": "3.5.18", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.18.tgz", - "integrity": "sha512-5aBjvGqsWs+MoxswZPoTB9nSDb3dhd1x30xrrltKujlCxo48j8HGDNj3QPhF4VIS0VQDUrA1xUfp2hEa+FNyXA==", + "node_modules/@vitejs/plugin-vue": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.1.tgz", + "integrity": "sha512-+MaE752hU0wfPFJEUAIxqw18+20euHHdxVtMvbFcOEpjEyfqXH/5DCoTHiVJ0J29EhTJdoTkjEv5YBKU9dnoTw==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.0", - "@vue/compiler-core": "3.5.18", - "@vue/compiler-dom": "3.5.18", - "@vue/compiler-ssr": "3.5.18", - "@vue/shared": "3.5.18", - "estree-walker": "^2.0.2", - "magic-string": "^0.30.17", - "postcss": "^8.5.6", - "source-map-js": "^1.2.1" + "@rolldown/pluginutils": "1.0.0-beta.29" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0", + "vue": "^3.2.25" } }, - "node_modules/@vue/compiler-sfc/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "license": "MIT" - }, - "node_modules/@vue/compiler-ssr": { - "version": "3.5.18", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.18.tgz", - "integrity": "sha512-xM16Ak7rSWHkM3m22NlmcdIM+K4BMyFARAfV9hYFl+SFuRzrZ3uGMNW05kA5pmeMa0X9X963Kgou7ufdbpOP9g==", + "node_modules/@vitest/coverage-v8": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.2.4.tgz", + "integrity": "sha512-EyF9SXU6kS5Ku/U82E259WSnvg6c8KTjppUncuNdm5QHpe17mwREHnjDzozC8x9MZ0xfBUFSaLkRv4TMA75ALQ==", + "dev": true, "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.18", - "@vue/shared": "3.5.18" + "@ampproject/remapping": "^2.3.0", + "@bcoe/v8-coverage": "^1.0.2", + "ast-v8-to-istanbul": "^0.3.3", + "debug": "^4.4.1", + "istanbul-lib-coverage": "^3.2.2", + "istanbul-lib-report": "^3.0.1", + "istanbul-lib-source-maps": "^5.0.6", + "istanbul-reports": "^3.1.7", + "magic-string": "^0.30.17", + "magicast": "^0.3.5", + "std-env": "^3.9.0", + "test-exclude": "^7.0.1", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@vitest/browser": "3.2.4", + "vitest": "3.2.4" + }, + "peerDependenciesMeta": { + "@vitest/browser": { + "optional": true + } } }, - "node_modules/@vue/devtools-api": { - "version": "7.7.6", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.6.tgz", - "integrity": "sha512-b2Xx0KvXZObePpXPYHvBRRJLDQn5nhKjXh7vUhMEtWxz1AYNFOVIsh5+HLP8xDGL7sy+Q7hXeUxPHB/KgbtsPw==", + "node_modules/@vitest/expect": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", + "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", "dev": true, + "license": "MIT", "dependencies": { - "@vue/devtools-kit": "^7.7.6" + "@types/chai": "^5.2.2", + "@vitest/spy": "3.2.4", + "@vitest/utils": "3.2.4", + "chai": "^5.2.0", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/@vue/devtools-kit": { - "version": "7.7.6", - "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.6.tgz", - "integrity": "sha512-geu7ds7tem2Y7Wz+WgbnbZ6T5eadOvozHZ23Atk/8tksHMFOFylKi1xgGlQlVn0wlkEf4hu+vd5ctj1G4kFtwA==", + "node_modules/@vitest/mocker": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz", + "integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==", "dev": true, + "license": "MIT", "dependencies": { - "@vue/devtools-shared": "^7.7.6", - "birpc": "^2.3.0", - "hookable": "^5.5.3", - "mitt": "^3.0.1", - "perfect-debounce": "^1.0.0", - "speakingurl": "^14.0.1", - "superjson": "^2.2.2" - } - }, - "node_modules/@vue/devtools-shared": { - "version": "7.7.6", - "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.6.tgz", - "integrity": "sha512-yFEgJZ/WblEsojQQceuyK6FzpFDx4kqrz2ohInxNj5/DnhoX023upTv4OD6lNPLAA5LLkbwPVb10o/7b+Y4FVA==", + "@vitest/spy": "3.2.4", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.17" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/pretty-format": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", + "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.4.tgz", + "integrity": "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "3.2.4", + "pathe": "^2.0.3", + "strip-literal": "^3.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz", + "integrity": "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.2.4", + "magic-string": "^0.30.17", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", + "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^4.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", + "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.2.4", + "loupe": "^3.1.4", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.22.tgz", + "integrity": "sha512-jQ0pFPmZwTEiRNSb+i9Ow/I/cHv2tXYqsnHKKyCQ08irI2kdF5qmYedmF8si8mA7zepUFmJ2hqzS8CQmNOWOkQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.4", + "@vue/shared": "3.5.22", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-core/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.22.tgz", + "integrity": "sha512-W8RknzUM1BLkypvdz10OVsGxnMAuSIZs9Wdx1vzA3mL5fNMN15rhrSCLiTm6blWeACwUwizzPVqGJgOGBEN/hA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.22", + "@vue/shared": "3.5.22" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.22.tgz", + "integrity": "sha512-tbTR1zKGce4Lj+JLzFXDq36K4vcSZbJ1RBu8FxcDv1IGRz//Dh2EBqksyGVypz3kXpshIfWKGOCcqpSbyGWRJQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.4", + "@vue/compiler-core": "3.5.22", + "@vue/compiler-dom": "3.5.22", + "@vue/compiler-ssr": "3.5.22", + "@vue/shared": "3.5.22", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.19", + "postcss": "^8.5.6", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-sfc/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.22.tgz", + "integrity": "sha512-GdgyLvg4R+7T8Nk2Mlighx7XGxq/fJf9jaVofc3IL0EPesTE86cP/8DD1lT3h1JeZr2ySBvyqKQJgbS54IX1Ww==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.22", + "@vue/shared": "3.5.22" + } + }, + "node_modules/@vue/devtools-api": { + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.7.tgz", + "integrity": "sha512-lwOnNBH2e7x1fIIbVT7yF5D+YWhqELm55/4ZKf45R9T8r9dE2AIOy8HKjfqzGsoTHFbWbr337O4E0A0QADnjBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^7.7.7" + } + }, + "node_modules/@vue/devtools-kit": { + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.7.tgz", + "integrity": "sha512-wgoZtxcTta65cnZ1Q6MbAfePVFxfM+gq0saaeytoph7nEa7yMXoi6sCPy4ufO111B9msnw0VOWjPEFCXuAKRHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-shared": "^7.7.7", + "birpc": "^2.3.0", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^1.0.0", + "speakingurl": "^14.0.1", + "superjson": "^2.2.2" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "7.7.7", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.7.tgz", + "integrity": "sha512-+udSj47aRl5aKb0memBvcUG9koarqnxNM5yjuREvqwK6T3ap4mn3Zqqc17QrBFTqSMjr3HK1cvStEZpMDpfdyw==", "dev": true, + "license": "MIT", "dependencies": { "rfdc": "^1.4.1" } }, "node_modules/@vue/reactivity": { - "version": "3.5.18", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.18.tgz", - "integrity": "sha512-x0vPO5Imw+3sChLM5Y+B6G1zPjwdOri9e8V21NnTnlEvkxatHEH5B5KEAJcjuzQ7BsjGrKtfzuQ5eQwXh8HXBg==", + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.22.tgz", + "integrity": "sha512-f2Wux4v/Z2pqc9+4SmgZC1p73Z53fyD90NFWXiX9AKVnVBEvLFOWCEgJD3GdGnlxPZt01PSlfmLqbLYzY/Fw4A==", "license": "MIT", "dependencies": { - "@vue/shared": "3.5.18" + "@vue/shared": "3.5.22" } }, "node_modules/@vue/runtime-core": { - "version": "3.5.18", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.18.tgz", - "integrity": "sha512-DUpHa1HpeOQEt6+3nheUfqVXRog2kivkXHUhoqJiKR33SO4x+a5uNOMkV487WPerQkL0vUuRvq/7JhRgLW3S+w==", + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.22.tgz", + "integrity": "sha512-EHo4W/eiYeAzRTN5PCextDUZ0dMs9I8mQ2Fy+OkzvRPUYQEyK9yAjbasrMCXbLNhF7P0OUyivLjIy0yc6VrLJQ==", "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.18", - "@vue/shared": "3.5.18" + "@vue/reactivity": "3.5.22", + "@vue/shared": "3.5.22" } }, "node_modules/@vue/runtime-dom": { - "version": "3.5.18", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.18.tgz", - "integrity": "sha512-YwDj71iV05j4RnzZnZtGaXwPoUWeRsqinblgVJwR8XTXYZ9D5PbahHQgsbmzUvCWNF6x7siQ89HgnX5eWkr3mw==", + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.22.tgz", + "integrity": "sha512-Av60jsryAkI023PlN7LsqrfPvwfxOd2yAwtReCjeuugTJTkgrksYJJstg1e12qle0NarkfhfFu1ox2D+cQotww==", "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.18", - "@vue/runtime-core": "3.5.18", - "@vue/shared": "3.5.18", + "@vue/reactivity": "3.5.22", + "@vue/runtime-core": "3.5.22", + "@vue/shared": "3.5.22", "csstype": "^3.1.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.5.18", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.18.tgz", - "integrity": "sha512-PvIHLUoWgSbDG7zLHqSqaCoZvHi6NNmfVFOqO+OnwvqMz/tqQr3FuGWS8ufluNddk7ZLBJYMrjcw1c6XzR12mA==", + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.22.tgz", + "integrity": "sha512-gXjo+ao0oHYTSswF+a3KRHZ1WszxIqO7u6XwNHqcqb9JfyIL/pbWrrh/xLv7jeDqla9u+LK7yfZKHih1e1RKAQ==", "license": "MIT", "dependencies": { - "@vue/compiler-ssr": "3.5.18", - "@vue/shared": "3.5.18" + "@vue/compiler-ssr": "3.5.22", + "@vue/shared": "3.5.22" }, "peerDependencies": { - "vue": "3.5.18" + "vue": "3.5.22" } }, "node_modules/@vue/shared": { - "version": "3.5.18", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.18.tgz", - "integrity": "sha512-cZy8Dq+uuIXbxCZpuLd2GJdeSO/lIzIspC2WtkqIpje5QyFbvLaI5wZtdUjLHjGZrlVX6GilejatWwVYYRc8tA==", + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.22.tgz", + "integrity": "sha512-F4yc6palwq3TT0u+FYf0Ns4Tfl9GRFURDN2gWG7L1ecIaS/4fCIuFOjMTnCyjsu/OK6vaDKLCrGAa+KvvH+h4w==", "license": "MIT" }, "node_modules/@vueuse/core": { - "version": "12.8.2", - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-12.8.2.tgz", - "integrity": "sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ==", - "dev": true, + "version": "13.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-13.9.0.tgz", + "integrity": "sha512-ts3regBQyURfCE2BcytLqzm8+MmLlo5Ln/KLoxDVcsZ2gzIwVNnQpQOL/UKV8alUqjSZOlpFZcRNsLRqj+OzyA==", + "license": "MIT", "dependencies": { "@types/web-bluetooth": "^0.0.21", - "@vueuse/metadata": "12.8.2", - "@vueuse/shared": "12.8.2", - "vue": "^3.5.13" + "@vueuse/metadata": "13.9.0", + "@vueuse/shared": "13.9.0" }, "funding": { "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vue": "^3.5.0" } }, "node_modules/@vueuse/integrations": { @@ -6862,6 +6464,7 @@ "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-12.8.2.tgz", "integrity": "sha512-fbGYivgK5uBTRt7p5F3zy6VrETlV9RtZjBqd1/HxGdjdckBgBM4ugP8LHpjolqTj14TXTxSK1ZfgPbHYyGuH7g==", "dev": true, + "license": "MIT", "dependencies": { "@vueuse/core": "12.8.2", "@vueuse/shared": "12.8.2", @@ -6923,20 +6526,38 @@ } } }, - "node_modules/@vueuse/metadata": { + "node_modules/@vueuse/integrations/node_modules/@vueuse/core": { + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-12.8.2.tgz", + "integrity": "sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/web-bluetooth": "^0.0.21", + "@vueuse/metadata": "12.8.2", + "@vueuse/shared": "12.8.2", + "vue": "^3.5.13" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/integrations/node_modules/@vueuse/metadata": { "version": "12.8.2", "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-12.8.2.tgz", "integrity": "sha512-rAyLGEuoBJ/Il5AmFHiziCPdQzRt88VxR+Y/A/QhJ1EWtWqPBBAxTAFaSkviwEuOEZNtW8pvkPgoCZQ+HxqW1A==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/antfu" } }, - "node_modules/@vueuse/shared": { + "node_modules/@vueuse/integrations/node_modules/@vueuse/shared": { "version": "12.8.2", "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-12.8.2.tgz", "integrity": "sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w==", "dev": true, + "license": "MIT", "dependencies": { "vue": "^3.5.13" }, @@ -6944,219 +6565,114 @@ "url": "https://github.com/sponsors/antfu" } }, - "node_modules/@webassemblyjs/ast": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", - "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", - "dev": true, - "dependencies": { - "@webassemblyjs/helper-numbers": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", - "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", - "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", - "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", - "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", - "dev": true, - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.13.2", - "@webassemblyjs/helper-api-error": "1.13.2", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", - "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", - "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/wasm-gen": "1.14.1" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", - "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", - "dev": true, - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", - "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", - "dev": true, - "dependencies": { - "@xtuc/long": "4.2.2" + "node_modules/@vueuse/metadata": { + "version": "13.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-13.9.0.tgz", + "integrity": "sha512-1AFRvuiGphfF7yWixZa0KwjYH8ulyjDCC0aFgrGRz8+P4kvDFSdXLVfTk5xAN9wEuD1J6z4/myMoYbnHoX07zg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" } }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", - "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", - "dev": true - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", - "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/helper-wasm-section": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-opt": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1", - "@webassemblyjs/wast-printer": "1.14.1" + "node_modules/@vueuse/shared": { + "version": "13.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-13.9.0.tgz", + "integrity": "sha512-e89uuTLMh0U5cZ9iDpEI2senqPGfbPRTHM/0AaQkcxnpqjkZqDYP8rpfm7edOz8s+pOCOROEy1PIveSW8+fL5g==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vue": "^3.5.0" } }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", - "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "node_modules/@whatwg-node/disposablestack": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@whatwg-node/disposablestack/-/disposablestack-0.0.6.tgz", + "integrity": "sha512-LOtTn+JgJvX8WfBVJtF08TGrdjuFzGJc4mkP8EdDI8ADbvO7kiexYep1o8dwnt0okb0jYclCDXF13xU7Ge4zSw==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" + "@whatwg-node/promise-helpers": "^1.0.0", + "tslib": "^2.6.3" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", - "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "node_modules/@whatwg-node/fetch": { + "version": "0.10.11", + "resolved": "https://registry.npmjs.org/@whatwg-node/fetch/-/fetch-0.10.11.tgz", + "integrity": "sha512-eR8SYtf9Nem1Tnl0IWrY33qJ5wCtIWlt3Fs3c6V4aAaTFLtkEQErXu3SSZg/XCHrj9hXSJ8/8t+CdMk5Qec/ZA==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1" + "@whatwg-node/node-fetch": "^0.8.0", + "urlpattern-polyfill": "^10.0.0" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", - "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "node_modules/@whatwg-node/node-fetch": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@whatwg-node/node-fetch/-/node-fetch-0.8.1.tgz", + "integrity": "sha512-cQmQEo7IsI0EPX9VrwygXVzrVlX43Jb7/DBZSmpnC7xH4xkyOnn/HykHpTaQk7TUs7zh59A5uTGqx3p2Ouzffw==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-api-error": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" + "@fastify/busboy": "^3.1.1", + "@whatwg-node/disposablestack": "^0.0.6", + "@whatwg-node/promise-helpers": "^1.3.2", + "tslib": "^2.6.3" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", - "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "node_modules/@whatwg-node/promise-helpers": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@whatwg-node/promise-helpers/-/promise-helpers-1.3.2.tgz", + "integrity": "sha512-Nst5JdK47VIl9UcGwtv2Rcgyn5lWtZ0/mhRQ4G8NN2isxpq2TO30iqHzmwoJycjWuyUfg3GFXqP/gFHXeV57IA==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webpack-cli/configtest": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-3.0.1.tgz", - "integrity": "sha512-u8d0pJ5YFgneF/GuvEiDA61Tf1VDomHHYMjv/wc9XzYj7nopltpG96nXN5dJRstxZhcNpV1g+nT6CydO7pHbjA==", - "dev": true, - "engines": { - "node": ">=18.12.0" + "tslib": "^2.6.3" }, - "peerDependencies": { - "webpack": "^5.82.0", - "webpack-cli": "6.x.x" - } - }, - "node_modules/@webpack-cli/info": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-3.0.1.tgz", - "integrity": "sha512-coEmDzc2u/ffMvuW9aCjoRzNSPDl/XLuhPdlFRpT9tZHmJ/039az33CE7uH+8s0uL1j5ZNtfdv0HkfaKRBGJsQ==", - "dev": true, "engines": { - "node": ">=18.12.0" - }, - "peerDependencies": { - "webpack": "^5.82.0", - "webpack-cli": "6.x.x" + "node": ">=16.0.0" } }, - "node_modules/@webpack-cli/serve": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-3.0.1.tgz", - "integrity": "sha512-sbgw03xQaCLiT6gcY/6u3qBDn01CWw/nbaXl3gTdTFuJJ75Gffv3E3DBpgvY2fkkrdS1fpjaXNOmJlnbtKauKg==", + "node_modules/@whatwg-node/server": { + "version": "0.10.13", + "resolved": "https://registry.npmjs.org/@whatwg-node/server/-/server-0.10.13.tgz", + "integrity": "sha512-Otmxo+0mp8az3B48pLI1I4msNOXPIoP7TLm6h5wOEQmynqHt8oP9nR6NJUeJk6iI5OtFpQtkbJFwfGkmplvc3Q==", "dev": true, - "engines": { - "node": ">=18.12.0" - }, - "peerDependencies": { - "webpack": "^5.82.0", - "webpack-cli": "6.x.x" + "license": "MIT", + "dependencies": { + "@envelop/instrumentation": "^1.0.0", + "@whatwg-node/disposablestack": "^0.0.6", + "@whatwg-node/fetch": "^0.10.10", + "@whatwg-node/promise-helpers": "^1.3.2", + "tslib": "^2.6.3" }, - "peerDependenciesMeta": { - "webpack-dev-server": { - "optional": true - } + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, "node_modules/@yarnpkg/lockfile": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", - "dev": true + "dev": true, + "license": "BSD-2-Clause" }, "node_modules/@yarnpkg/parsers": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-3.0.2.tgz", "integrity": "sha512-/HcYgtUSiJiot/XWGLOlGxPYUG65+/31V8oqk17vZLW1xlCoR4PampyePljOxY2n8/3jz9+tIFzICsyGujJZoA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "js-yaml": "^3.10.0", "tslib": "^2.4.0" @@ -7170,6 +6686,7 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, + "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } @@ -7179,6 +6696,7 @@ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -7187,17 +6705,12 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/@yarnpkg/parsers/node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, "node_modules/@zkochan/js-yaml": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/@zkochan/js-yaml/-/js-yaml-0.0.7.tgz", "integrity": "sha512-nrUSn7hzt7J6JWgWGz78ZYI8wj+gdIJdk0Ynjpp8l+trkn58Uqsf6RYrYkEK+3X18EX+TNdtJI0WxAtc+L84SQ==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -7210,26 +6723,17 @@ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", "dev": true, + "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dev": true, - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, "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" @@ -7242,6 +6746,8 @@ "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" } @@ -7259,72 +6765,39 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-phases": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", - "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.13.0" - }, - "peerDependencies": { - "acorn": "^8.14.0" - } - }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, + "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", - "dev": true, - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/add-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", "integrity": "sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/agent-base": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 14" } }, - "node_modules/agentkeepalive": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz", - "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", - "dev": true, - "dependencies": { - "humanize-ms": "^1.2.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, "node_modules/aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "dev": true, + "license": "MIT", "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -7338,6 +6811,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -7349,83 +6823,38 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ajv-formats": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", - "dev": true, - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "node_modules/algoliasearch": { + "version": "5.40.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.40.0.tgz", + "integrity": "sha512-a9aIL2E3Z7uYUPMCmjMFFd5MWhn+ccTubEvnMy7rOTZCB62dXBJtz0R5BZ/TPuX3R9ocBsgWuAbGWQ+Ph4Fmlg==", "dev": true, + "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/algoliasearch": { - "version": "5.24.0", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.24.0.tgz", - "integrity": "sha512-CkaUygzZ91Xbw11s0CsHMawrK3tl+Ue57725HGRgRzKgt2Z4wvXVXRCtQfvzh8K7Tp4Zp7f1pyHAtMROtTJHxg==", - "dev": true, - "dependencies": { - "@algolia/client-abtesting": "5.24.0", - "@algolia/client-analytics": "5.24.0", - "@algolia/client-common": "5.24.0", - "@algolia/client-insights": "5.24.0", - "@algolia/client-personalization": "5.24.0", - "@algolia/client-query-suggestions": "5.24.0", - "@algolia/client-search": "5.24.0", - "@algolia/ingestion": "1.24.0", - "@algolia/monitoring": "1.24.0", - "@algolia/recommend": "5.24.0", - "@algolia/requester-browser-xhr": "5.24.0", - "@algolia/requester-fetch": "5.24.0", - "@algolia/requester-node-http": "5.24.0" + "@algolia/abtesting": "1.6.0", + "@algolia/client-abtesting": "5.40.0", + "@algolia/client-analytics": "5.40.0", + "@algolia/client-common": "5.40.0", + "@algolia/client-insights": "5.40.0", + "@algolia/client-personalization": "5.40.0", + "@algolia/client-query-suggestions": "5.40.0", + "@algolia/client-search": "5.40.0", + "@algolia/ingestion": "1.40.0", + "@algolia/monitoring": "1.40.0", + "@algolia/recommend": "5.40.0", + "@algolia/requester-browser-xhr": "5.40.0", + "@algolia/requester-fetch": "5.40.0", + "@algolia/requester-node-http": "5.40.0" }, "engines": { "node": ">= 14.0.0" } }, - "node_modules/ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "dev": true, - "dependencies": { - "string-width": "^4.1.0" - } - }, "node_modules/ansi-colors": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -7434,6 +6863,7 @@ "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "license": "MIT", "dependencies": { "type-fest": "^0.21.3" }, @@ -7444,21 +6874,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", "engines": { "node": ">=8" } @@ -7468,6 +6888,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -7480,6 +6901,7 @@ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, + "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -7492,45 +6914,36 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/appdata-path/-/appdata-path-1.0.0.tgz", "integrity": "sha512-ZbH3ezXfnT/YE3NdqduIt4lBV+H0ybvA2Qx3K76gIjQvh8gROpDFdDLpx6B1QJtW7zxisCbpTlCLhKqoR8cDBw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/aproba": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "dev": true - }, - "node_modules/are-we-there-yet": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", - "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", - "deprecated": "This package is no longer supported.", "dev": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } + "license": "ISC" }, "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true, + "license": "MIT" }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "dev": true, + "license": "Python-2.0" }, "node_modules/array-buffer-byte-length": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "is-array-buffer": "^3.0.5" @@ -7547,6 +6960,7 @@ "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -7554,19 +6968,23 @@ "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true, + "license": "MIT" }, "node_modules/array-ify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -7576,6 +6994,7 @@ "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", "dev": true, + "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.8", @@ -7597,66 +7016,69 @@ "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } }, - "node_modules/asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", - "optional": true, + "node_modules/ast-v8-to-istanbul": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-0.3.5.tgz", + "integrity": "sha512-9SdXjNheSiE8bALAQCQQuT6fgQaoxJh7IRYrRGZ8/9nv8WhJeC1aXAwN8TbaOssGOukUvyvnkgD9+Yuykvl1aA==", + "dev": true, + "license": "MIT", "dependencies": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" + "@jridgewell/trace-mapping": "^0.3.30", + "estree-walker": "^3.0.3", + "js-tokens": "^9.0.1" } }, "node_modules/async": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/async-function": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" } }, - "node_modules/async-mutex": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.5.0.tgz", - "integrity": "sha512-1A94B18jkJ3DYq284ohPxoXbfTA5HsQ7/Mf4DEhcyLx3Bz27Rh59iScbB6EPiP+B+joue6YCxcMXSbFC1tZKwA==", - "dev": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/async-validator": { "version": "4.2.5", "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz", - "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==" + "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==", + "license": "MIT" }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT" }, "node_modules/at-least-node": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", "dev": true, + "license": "ISC", "engines": { "node": ">= 4.0.0" } @@ -7666,6 +7088,7 @@ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, + "license": "MIT", "dependencies": { "possible-typed-array-names": "^1.0.0" }, @@ -7677,9 +7100,10 @@ } }, "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==", + "dev": true, "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", @@ -7687,28 +7111,6 @@ "proxy-from-env": "^1.1.0" } }, - "node_modules/b4a": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", - "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==", - "dev": true - }, - "node_modules/babel-loader": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-10.0.0.tgz", - "integrity": "sha512-z8jt+EdS61AMw22nSfoNJAZ0vrtmhPRVi6ghL3rCeRZI8cdNYFiV5xeV3HbE7rlZZNmGH8BVccwWt8/ED0QOHA==", - "dev": true, - "dependencies": { - "find-up": "^5.0.0" - }, - "engines": { - "node": "^18.20.0 || ^20.10.0 || >=22.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0", - "webpack": ">=5.61.0" - } - }, "node_modules/babel-plugin-polyfill-corejs2": { "version": "0.4.14", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz", @@ -7765,14 +7167,8 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/bare-events": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz", - "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==", "dev": true, - "optional": true + "license": "MIT" }, "node_modules/base64-js": { "version": "1.5.1", @@ -7791,44 +7187,32 @@ "type": "consulting", "url": "https://feross.org/support" } - ] - }, - "node_modules/base64id": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", - "engines": { - "node": "^4.5.0 || >= 5.9" - } + ], + "license": "MIT" }, - "node_modules/bcryptjs": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-3.0.2.tgz", - "integrity": "sha512-k38b3XOZKv60C4E2hVsXTolJWfkGRMbILBIe2IBITXciy5bOsTKot5kDrf3ZfufQtQOUN5mXceUEpU1rTl9Uog==", + "node_modules/baseline-browser-mapping": { + "version": "2.8.16", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.16.tgz", + "integrity": "sha512-OMu3BGQ4E7P1ErFsIPpbJh0qvDudM/UuJeHgkAvfWe+0HFJCXh+t/l8L6fVLR55RI/UbKrVLnAXZSVwd9ysWYw==", + "dev": true, + "license": "Apache-2.0", "bin": { - "bcrypt": "bin/bcrypt" + "baseline-browser-mapping": "dist/cli.js" } }, "node_modules/before-after-hook": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", - "dev": true - }, - "node_modules/bignumber.js": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", - "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==", "dev": true, - "engines": { - "node": "*" - } + "license": "Apache-2.0" }, "node_modules/bin-links": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/bin-links/-/bin-links-4.0.4.tgz", "integrity": "sha512-cMtq4W5ZsEwcutJrVId+a/tjt8GSbS+h0oNkdl6+6rBuEv8Ot33Bevj5KPm40t309zuhVic8NjpuL42QCiJWWA==", "dev": true, + "license": "ISC", "dependencies": { "cmd-shim": "^6.0.0", "npm-normalize-package-bin": "^3.0.0", @@ -7844,6 +7228,7 @@ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -7851,20 +7236,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "dependencies": { - "file-uri-to-path": "1.0.0" - } - }, "node_modules/birpc": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.3.0.tgz", - "integrity": "sha512-ijbtkn/F3Pvzb6jHypHRyve2QApOCZDR25D/VnkY2G/lBNcXCTsnsCxgY4k4PkVB7zfwzYbY3O9Lcqe3xufS5g==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.6.1.tgz", + "integrity": "sha512-LPnFhlDpdSH6FJhJyn4M0kFO7vtQ5iPw24FnG0y21q09xC7e8+1LeR31S1MAIrDAHp4m7aas4bEkTDTvMAtebQ==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/antfu" } @@ -7873,22 +7250,19 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "license": "MIT", "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", "readable-stream": "^3.4.0" } }, - "node_modules/bn.js": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz", - "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==", - "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==", + "dev": true, + "license": "MIT", "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.5", @@ -7912,19 +7286,38 @@ "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/body-parser/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/body-parser/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "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==", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.0.6" }, @@ -7935,206 +7328,63 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/boxen": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz", - "integrity": "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==", + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-align": "^3.0.1", - "camelcase": "^7.0.1", - "chalk": "^5.2.0", - "cli-boxes": "^3.0.0", - "string-width": "^5.1.2", - "type-fest": "^2.13.0", - "widest-line": "^4.0.1", - "wrap-ansi": "^8.1.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "balanced-match": "^1.0.0" } }, - "node_modules/boxen/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, - "engines": { - "node": ">=12" + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/boxen/node_modules/camelcase": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", - "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", - "dev": true, "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/boxen/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/boxen/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "node_modules/browserslist": { + "version": "4.26.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.3.tgz", + "integrity": "sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" + "baseline-browser-mapping": "^2.8.9", + "caniuse-lite": "^1.0.30001746", + "electron-to-chromium": "^1.5.227", + "node-releases": "^2.0.21", + "update-browserslist-db": "^1.1.3" }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/boxen/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", - "optional": true - }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "node_modules/browserslist": { - "version": "4.25.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz", - "integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "caniuse-lite": "^1.0.30001726", - "electron-to-chromium": "^1.5.173", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.3" - }, - "bin": { - "browserslist": "cli.js" + "bin": { + "browserslist": "cli.js" }, "engines": { "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/bson": { - "version": "6.10.4", - "resolved": "https://registry.npmjs.org/bson/-/bson-6.10.4.tgz", - "integrity": "sha512-WIsKqkSC0ABoBJuT1LEX+2HEvNmNKKgnTAyd0fL8qzK4SH2i9NXg+t08YtdZp/V9IZ33cxe3iV4yM0qg8lMQng==", - "license": "Apache-2.0", - "engines": { - "node": ">=16.20.1" - } - }, "node_modules/buffer": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", @@ -8153,51 +7403,25 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" - }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "node_modules/bundle-name": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", - "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", "dev": true, - "dependencies": { - "run-applescript": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "license": "MIT" }, "node_modules/byte-size": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/byte-size/-/byte-size-8.1.1.tgz", "integrity": "sha512-tUkzZWK0M/qdoLEqikxBWe4kumyuwjl3HO6zHTr4yEI23EojPtLYXdG1+AQY7MN0cGyNDvEaJ8wiYQm6P2bPxg==", "dev": true, + "license": "MIT", "engines": { "node": ">=12.17" } @@ -8206,33 +7430,10 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/c8": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/c8/-/c8-9.1.0.tgz", - "integrity": "sha512-mBWcT5iqNir1zIkzSPyI3NCR9EZCVI3WUD+AVO17MVWTSFNyUueXE82qTeampNtTr+ilN/5Ua3j24LgbCKjDVg==", "dev": true, - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@istanbuljs/schema": "^0.1.3", - "find-up": "^5.0.0", - "foreground-child": "^3.1.1", - "istanbul-lib-coverage": "^3.2.0", - "istanbul-lib-report": "^3.0.1", - "istanbul-reports": "^3.1.6", - "test-exclude": "^6.0.0", - "v8-to-istanbul": "^9.0.0", - "yargs": "^17.7.2", - "yargs-parser": "^21.1.1" - }, - "bin": { - "c8": "bin/c8.js" - }, + "license": "MIT", "engines": { - "node": ">=14.14.0" + "node": ">= 0.8" } }, "node_modules/cac": { @@ -8250,6 +7451,7 @@ "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.4.tgz", "integrity": "sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ==", "dev": true, + "license": "ISC", "dependencies": { "@npmcli/fs": "^3.1.0", "fs-minipass": "^3.0.0", @@ -8268,50 +7470,12 @@ "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/cacheable-lookup": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", - "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", - "dev": true, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/cacheable-request": { - "version": "10.2.14", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", - "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", - "dev": true, - "dependencies": { - "@types/http-cache-semantics": "^4.0.2", - "get-stream": "^6.0.1", - "http-cache-semantics": "^4.1.1", - "keyv": "^4.5.3", - "mimic-response": "^4.0.0", - "normalize-url": "^8.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/cacheable-request/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/call-bind": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", "dev": true, + "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", @@ -8329,6 +7493,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" @@ -8341,6 +7506,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" @@ -8357,6 +7523,7 @@ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -8366,6 +7533,7 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -8375,6 +7543,7 @@ "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", "dev": true, + "license": "MIT", "dependencies": { "camelcase": "^5.3.1", "map-obj": "^4.0.0", @@ -8388,9 +7557,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001731", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001731.tgz", - "integrity": "sha512-lDdp2/wrOmTRWuoB5DpfNkC0rJDU8DqRa6nYL6HK6sytw70QMopt/NIc/9SM7ylItlBWfACXk0tEn37UWM/+mg==", + "version": "1.0.30001749", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001749.tgz", + "integrity": "sha512-0rw2fJOmLfnzCRbkm8EyHL8SvI2Apu5UbnQuTsJ0ClgrH8hcwFooJ1s5R0EP8o8aVrFu8++ae29Kt9/gZAZp/Q==", "dev": true, "funding": [ { @@ -8412,15 +7581,34 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/chai": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", + "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/chalk": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", - "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -8432,6 +7620,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -8441,21 +7630,34 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "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/check-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + } }, "node_modules/chokidar": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "dev": true, + "license": "MIT", "dependencies": { "readdirp": "^4.0.1" }, @@ -8471,19 +7673,11 @@ "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "dev": true, + "license": "ISC", "engines": { "node": ">=10" } }, - "node_modules/chrome-trace-event": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", - "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", - "dev": true, - "engines": { - "node": ">=6.0" - } - }, "node_modules/ci-info": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", @@ -8495,6 +7689,7 @@ "url": "https://github.com/sponsors/sibiraj-s" } ], + "license": "MIT", "engines": { "node": ">=8" } @@ -8504,26 +7699,16 @@ "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/cli-boxes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", - "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "license": "MIT", "dependencies": { "restore-cursor": "^3.1.0" }, @@ -8535,6 +7720,7 @@ "version": "2.6.1", "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", + "license": "MIT", "engines": { "node": ">=6" }, @@ -8542,25 +7728,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cli-table3": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", - "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" - } - }, "node_modules/cli-width": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "license": "ISC", "engines": { "node": ">= 12" } @@ -8570,6 +7742,7 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, + "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", @@ -8584,6 +7757,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -8599,6 +7773,7 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -8615,6 +7790,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "license": "MIT", "engines": { "node": ">=0.8" } @@ -8624,6 +7800,7 @@ "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", "dev": true, + "license": "MIT", "dependencies": { "is-plain-object": "^2.0.4", "kind-of": "^6.0.2", @@ -8638,29 +7815,16 @@ "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-6.0.3.tgz", "integrity": "sha512-FMabTRlc5t5zjdenF6mS0MBeFZm0XqHqeOkcskKFb/LYCcRQ5fVgLOHVc4Lq9CqABd9zhjwPjMBCJvMCziSVtA==", "dev": true, + "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/co-body": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/co-body/-/co-body-6.2.0.tgz", - "integrity": "sha512-Kbpv2Yd1NdL1V/V4cwLVxraHDV6K8ayohr2rmH0J87Er8+zJjcTa6dAn9QMPC9CRgU8+aNajKbSf1TzDB1yKPA==", - "dependencies": { - "@hapi/bourne": "^3.0.0", - "inflation": "^2.0.0", - "qs": "^6.5.2", - "raw-body": "^2.3.3", - "type-is": "^1.6.16" - }, - "engines": { - "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==", + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -8671,28 +7835,32 @@ "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==" + "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" } }, "node_modules/colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", - "dev": true + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true, + "license": "MIT" }, "node_modules/columnify": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.6.0.tgz", "integrity": "sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==", "dev": true, + "license": "MIT", "dependencies": { "strip-ansi": "^6.0.1", "wcwidth": "^1.0.0" @@ -8705,6 +7873,8 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" }, @@ -8716,6 +7886,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -8725,6 +7896,7 @@ "version": "12.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "license": "MIT", "engines": { "node": ">=18" } @@ -8733,46 +7905,36 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/common-tags": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4.0.0" } }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true - }, "node_modules/compare-func": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", "dev": true, + "license": "MIT", "dependencies": { "array-ify": "^1.0.0", "dot-prop": "^5.1.0" } }, - "node_modules/component-emitter": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", - "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "license": "MIT", "dependencies": { "mime-db": ">= 1.43.0 < 2" }, @@ -8784,6 +7946,7 @@ "version": "1.8.1", "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", + "dev": true, "license": "MIT", "dependencies": { "bytes": "3.1.2", @@ -8802,6 +7965,8 @@ "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" } @@ -8809,13 +7974,16 @@ "node_modules/compression/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/concat-stream": { "version": "2.0.0", @@ -8825,6 +7993,7 @@ "engines": [ "node >= 6.0" ], + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", @@ -8836,81 +8005,8 @@ "version": "0.2.2", "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.2.tgz", "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==", - "dev": true - }, - "node_modules/config": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/config/-/config-4.1.0.tgz", - "integrity": "sha512-uxu0WQTPXwwkR9ZVNQm3ID3f39lWa9HEmppVC6q2HL6sOZszTBL/HGwIHG1dhnWW8006TkhHwZjX6yvAfkXp6Q==", - "license": "MIT", - "dependencies": { - "json5": "^2.2.3" - }, - "engines": { - "node": ">= 20.0.0" - } - }, - "node_modules/config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", - "dev": true, - "dependencies": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "node_modules/configstore": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", - "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", - "dev": true, - "dependencies": { - "dot-prop": "^6.0.1", - "graceful-fs": "^4.2.6", - "unique-string": "^3.0.0", - "write-file-atomic": "^3.0.3", - "xdg-basedir": "^5.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/yeoman/configstore?sponsor=1" - } - }, - "node_modules/configstore/node_modules/dot-prop": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", - "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", - "dev": true, - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/configstore/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/configstore/node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } + "dev": true, + "license": "MIT" }, "node_modules/consola": { "version": "3.4.2", @@ -8926,12 +8022,15 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "dev": true + "dev": true, + "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==", + "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "5.2.1" }, @@ -8943,6 +8042,8 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -8952,6 +8053,7 @@ "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz", "integrity": "sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==", "dev": true, + "license": "ISC", "dependencies": { "compare-func": "^2.0.0" }, @@ -8964,6 +8066,7 @@ "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-5.0.1.tgz", "integrity": "sha512-Rvi5pH+LvgsqGwZPZ3Cq/tz4ty7mjijhr3qR4m9IBXNbxGGYgTVVO+duXzz9aArmHxFtwZ+LRkrNIMDQzgoY4A==", "dev": true, + "license": "MIT", "dependencies": { "add-stream": "^1.0.0", "conventional-changelog-writer": "^6.0.0", @@ -8986,6 +8089,7 @@ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", "dev": true, + "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -8998,6 +8102,7 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -9010,6 +8115,7 @@ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^4.0.1", "is-core-module": "^2.5.0", @@ -9025,6 +8131,7 @@ "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-3.0.0.tgz", "integrity": "sha512-qy9XbdSLmVnwnvzEisjxdDiLA4OmV3o8db+Zdg4WiFw14fP3B6XNz98X0swPPpkTd/pc1K7+adKgEDM1JCUMiA==", "dev": true, + "license": "MIT", "engines": { "node": ">=14" } @@ -9034,6 +8141,7 @@ "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-6.0.1.tgz", "integrity": "sha512-359t9aHorPw+U+nHzUXHS5ZnPBOizRxfQsWT5ZDHBfvfxQOAik+yfuhKXG66CN5LEWPpMNnIMHUTCKeYNprvHQ==", "dev": true, + "license": "MIT", "dependencies": { "conventional-commits-filter": "^3.0.0", "dateformat": "^3.0.3", @@ -9055,6 +8163,7 @@ "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-3.0.0.tgz", "integrity": "sha512-1ymej8b5LouPx9Ox0Dw/qAO2dVdfpRFq28e5Y0jJEU8ZrLdy0vOSkkIInwmxErFGhg6SALro60ZrwYFVTUDo4Q==", "dev": true, + "license": "MIT", "dependencies": { "lodash.ismatch": "^4.4.0", "modify-values": "^1.0.1" @@ -9068,6 +8177,7 @@ "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-4.0.0.tgz", "integrity": "sha512-WRv5j1FsVM5FISJkoYMR6tPk07fkKT0UodruX4je86V4owk451yjXAKzKAPOs9l7y59E2viHUS9eQ+dfUA9NSg==", "dev": true, + "license": "MIT", "dependencies": { "is-text-path": "^1.0.1", "JSONStream": "^1.3.5", @@ -9086,6 +8196,7 @@ "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-7.0.1.tgz", "integrity": "sha512-Ft79FF4SlOFvX4PkwFDRnaNiIVX7YbmqGU0RwccUaiGvgp3S0a8ipR2/Qxk31vclDNM+GSdJOVs2KrsUCjblVA==", "dev": true, + "license": "MIT", "dependencies": { "concat-stream": "^2.0.0", "conventional-changelog-preset-loader": "^3.0.0", @@ -9106,67 +8217,32 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true + "dev": true, + "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==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-session": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/cookie-session/-/cookie-session-2.1.1.tgz", - "integrity": "sha512-ji3kym/XZaFVew1+tIZk5ZLp9Z/fLv9rK1aZmpug0FsgE7Cu3ZDrUdRo7FT9vFjMYfNimrrUHJzywDwT7XEFlg==", + "dev": true, "license": "MIT", - "dependencies": { - "cookies": "0.9.1", - "debug": "3.2.7", - "on-headers": "~1.1.0", - "safe-buffer": "5.2.1" - }, "engines": { - "node": ">= 0.10" - } - }, - "node_modules/cookie-session/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" + "node": ">= 0.6" } }, "node_modules/cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" - }, - "node_modules/cookiejar": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", - "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", - "dev": true - }, - "node_modules/cookies": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.9.1.tgz", - "integrity": "sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==", - "dependencies": { - "depd": "~2.0.0", - "keygrip": "~1.1.0" - }, - "engines": { - "node": ">= 0.8" - } + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true, + "license": "MIT" }, "node_modules/copy-anything": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz", "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==", "dev": true, + "license": "MIT", "dependencies": { "is-what": "^4.1.8" }, @@ -9178,13 +8254,13 @@ } }, "node_modules/core-js-compat": { - "version": "3.44.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.44.0.tgz", - "integrity": "sha512-JepmAj2zfl6ogy34qfWtcE7nHKAJnKsQFRn++scjVS2bZFllwptzw61BZcZFYBPpUznLfAvh0LGhxKppk04ClA==", + "version": "3.46.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.46.0.tgz", + "integrity": "sha512-p9hObIIEENxSV8xIu+V68JjSeARg6UVMG5mR+JEUguG3sI6MsiS1njz2jHmyJDvA+8jX/sytkBHup6kxhM9law==", "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.25.1" + "browserslist": "^4.26.3" }, "funding": { "type": "opencollective", @@ -9195,12 +8271,15 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/cors": { "version": "2.8.5", "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "license": "MIT", "dependencies": { "object-assign": "^4", "vary": "^1" @@ -9214,6 +8293,7 @@ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", "dev": true, + "license": "MIT", "dependencies": { "env-paths": "^2.2.1", "import-fresh": "^3.3.0", @@ -9235,29 +8315,16 @@ } } }, - "node_modules/crc": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", - "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", - "dependencies": { - "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", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -9268,30 +8335,13 @@ } }, "node_modules/crypto-random-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", - "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", - "dev": true, - "dependencies": { - "type-fest": "^1.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/crypto-random-string/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", "dev": true, + "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "node_modules/css-tree": { @@ -9299,6 +8349,7 @@ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", "dev": true, + "license": "MIT", "dependencies": { "mdn-data": "2.12.2", "source-map-js": "^1.0.1" @@ -9312,6 +8363,7 @@ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true, + "license": "MIT", "bin": { "cssesc": "bin/cssesc" }, @@ -9330,6 +8382,7 @@ "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -9339,6 +8392,7 @@ "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", @@ -9356,6 +8410,7 @@ "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", @@ -9373,6 +8428,7 @@ "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -9389,6 +8445,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz", "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/kossnocorp" @@ -9399,19 +8456,22 @@ "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", "dev": true, + "license": "MIT", "engines": { "node": "*" } }, "node_modules/dayjs": { - "version": "1.11.13", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", - "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==" + "version": "1.11.18", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.18.tgz", + "integrity": "sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA==", + "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==", + "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -9430,6 +8490,7 @@ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -9439,6 +8500,7 @@ "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", "dev": true, + "license": "MIT", "dependencies": { "decamelize": "^1.1.0", "map-obj": "^1.0.0" @@ -9455,6 +8517,7 @@ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -9463,42 +8526,17 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.4.1.tgz", "integrity": "sha512-+8VxcR21HhTy8nOt6jf20w0c9CADrw1O8d+VZ/YzzCt4bJ3uBjw+D1q2osAB8RnpwwaeYBxy0HyKQxD5JBMuuQ==", + "license": "MIT", "engines": { "node": ">=14.16" } }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/dedent": { "version": "1.5.3", "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", "dev": true, + "license": "MIT", "peerDependencies": { "babel-plugin-macros": "^3.1.0" }, @@ -9508,67 +8546,38 @@ } } }, - "node_modules/deep-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==" - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", "dev": true, + "license": "MIT", "engines": { - "node": ">=4.0.0" + "node": ">=6" } }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/deepmerge": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/default-browser": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", - "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", - "dev": true, - "dependencies": { - "bundle-name": "^4.1.0", - "default-browser-id": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser-id": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", - "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/defaults": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "license": "MIT", "dependencies": { "clone": "^1.0.2" }, @@ -9576,20 +8585,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/define-data-property": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -9607,6 +8608,7 @@ "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -9616,6 +8618,7 @@ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, + "license": "MIT", "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", @@ -9639,19 +8642,18 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", "engines": { "node": ">=0.4.0" } }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" - }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -9660,12 +8662,14 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", "engines": { "node": ">=6" } @@ -9681,6 +8685,8 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" @@ -9691,33 +8697,23 @@ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", "integrity": "sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, - "node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", - "dev": true, - "optional": true, - "bin": { - "detect-libc": "bin/detect-libc.js" - }, - "engines": { - "node": ">=0.10" - } - }, "node_modules/detect-node": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/devlop": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", "dependencies": { "dequal": "^2.0.0" }, @@ -9726,67 +8722,26 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/dezalgo": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", - "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", - "dependencies": { - "asap": "^2.0.0", - "wrappy": "1" - } - }, - "node_modules/diff": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", - "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, "node_modules/diff-sequences": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true, + "license": "MIT", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/docs": { "resolved": "docs", "link": true }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/dot-prop": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", "dev": true, + "license": "MIT", "dependencies": { "is-obj": "^2.0.0" }, @@ -9799,6 +8754,7 @@ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=12" }, @@ -9811,6 +8767,7 @@ "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz", "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "dotenv": "^16.4.5" }, @@ -9825,6 +8782,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", @@ -9838,32 +8796,29 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, - "node_modules/ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "dependencies": { - "safe-buffer": "^5.0.1" - } + "dev": true, + "license": "MIT" }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true, + "license": "MIT" }, "node_modules/ejs": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "jake": "^10.8.5" }, @@ -9875,31 +8830,31 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.194", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.194.tgz", - "integrity": "sha512-SdnWJwSUot04UR51I2oPD8kuP2VI37/CADR1OHsFOUzZIvfWJBO6q11k5P/uKNyTT3cdOsnyjkrZ+DDShqYqJA==", + "version": "1.5.234", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.234.tgz", + "integrity": "sha512-RXfEp2x+VRYn8jbKfQlRImzoJU01kyDvVPBmG39eU2iuRVhuS6vQNocB8J0/8GrIMLnPzgz4eW6WiRnJkTuNWg==", "dev": true, "license": "ISC" }, "node_modules/element-plus": { - "version": "2.10.5", - "resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.10.5.tgz", - "integrity": "sha512-O9wTDu3Tm51ACVByWrThtBhH4Ygefg1HGY5pyAaxnoIrj8uMN0GtZ4IREwR3Yw/6sM2HyxjrsGI/D46iUVP97A==", + "version": "2.11.4", + "resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.11.4.tgz", + "integrity": "sha512-sLq+Ypd0cIVilv8wGGMEGvzRVBBsRpJjnAS5PsI/1JU1COZXqzH3N1UYMUc/HCdvdjf6dfrBy80Sj7KcACsT7w==", "license": "MIT", "dependencies": { "@ctrl/tinycolor": "^3.4.1", "@element-plus/icons-vue": "^2.3.1", "@floating-ui/dom": "^1.0.1", "@popperjs/core": "npm:@sxzz/popperjs-es@^2.11.7", - "@types/lodash": "^4.14.182", - "@types/lodash-es": "^4.17.6", + "@types/lodash": "^4.17.20", + "@types/lodash-es": "^4.17.12", "@vueuse/core": "^9.1.0", "async-validator": "^4.2.5", "dayjs": "^1.11.13", "escape-html": "^1.0.3", "lodash": "^4.17.21", "lodash-es": "^4.17.21", - "lodash-unified": "^1.0.2", + "lodash-unified": "^1.0.3", "memoize-one": "^6.0.0", "normalize-wheel-es": "^1.2.0" }, @@ -9910,12 +8865,14 @@ "node_modules/element-plus/node_modules/@types/web-bluetooth": { "version": "0.0.16", "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz", - "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==" + "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==", + "license": "MIT" }, "node_modules/element-plus/node_modules/@vueuse/core": { "version": "9.13.0", "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-9.13.0.tgz", "integrity": "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==", + "license": "MIT", "dependencies": { "@types/web-bluetooth": "^0.0.16", "@vueuse/metadata": "9.13.0", @@ -9931,6 +8888,7 @@ "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", "hasInstallScript": true, + "license": "MIT", "bin": { "vue-demi-fix": "bin/vue-demi-fix.js", "vue-demi-switch": "bin/vue-demi-switch.js" @@ -9955,6 +8913,7 @@ "version": "9.13.0", "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-9.13.0.tgz", "integrity": "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/antfu" } @@ -9963,6 +8922,7 @@ "version": "9.13.0", "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-9.13.0.tgz", "integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==", + "license": "MIT", "dependencies": { "vue-demi": "*" }, @@ -9975,6 +8935,7 @@ "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", "hasInstallScript": true, + "license": "MIT", "bin": { "vue-demi-fix": "bin/vue-demi-fix.js", "vue-demi-switch": "bin/vue-demi-switch.js" @@ -9995,36 +8956,25 @@ } } }, - "node_modules/elliptic": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", - "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", - "optional": true, - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" }, "node_modules/emoji-regex-xs": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/emoji-regex-xs/-/emoji-regex-xs-1.0.0.tgz", "integrity": "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/encodeurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -10034,6 +8984,7 @@ "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "iconv-lite": "^0.6.2" @@ -10044,6 +8995,7 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -10053,113 +9005,21 @@ } }, "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", "dev": true, + "license": "MIT", "dependencies": { "once": "^1.4.0" } }, - "node_modules/engine.io": { - "version": "6.6.4", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.4.tgz", - "integrity": "sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g==", - "dependencies": { - "@types/cors": "^2.8.12", - "@types/node": ">=10.0.0", - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "~0.7.2", - "cors": "~2.8.5", - "debug": "~4.3.1", - "engine.io-parser": "~5.2.1", - "ws": "~8.17.1" - }, - "engines": { - "node": ">=10.2.0" - } - }, - "node_modules/engine.io-client": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.6.3.tgz", - "integrity": "sha512-T0iLjnyNWahNyv/lcjS2y4oE358tVS/SYQNxYXGAJ9/GLgH4VCvOQ/mhTjqU88mLZCQgiG8RIegFHYCdVC+j5w==", - "dev": true, - "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1", - "engine.io-parser": "~5.2.1", - "ws": "~8.17.1", - "xmlhttprequest-ssl": "~2.1.1" - } - }, - "node_modules/engine.io-client/node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/engine.io-parser": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", - "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", - "engines": { - "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==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/engine.io/node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/enhanced-resolve": { - "version": "5.18.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", - "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/enquirer": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", "dev": true, + "license": "MIT", "dependencies": { "ansi-colors": "^4.1.1" }, @@ -10171,6 +9031,7 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", "engines": { "node": ">=0.12" }, @@ -10183,6 +9044,7 @@ "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -10192,6 +9054,7 @@ "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.13.0.tgz", "integrity": "sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==", "dev": true, + "license": "MIT", "bin": { "envinfo": "dist/cli.js" }, @@ -10203,39 +9066,42 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "dev": true + "dev": true, + "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": { "is-arrayish": "^0.2.1" } }, "node_modules/es-abstract": { - "version": "1.23.9", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz", - "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==", + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", + "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", "dev": true, + "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.2", "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", - "call-bound": "^1.0.3", + "call-bound": "^1.0.4", "data-view-buffer": "^1.0.2", "data-view-byte-length": "^1.0.2", "data-view-byte-offset": "^1.0.1", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", + "es-object-atoms": "^1.1.1", "es-set-tostringtag": "^2.1.0", "es-to-primitive": "^1.3.0", "function.prototype.name": "^1.1.8", - "get-intrinsic": "^1.2.7", - "get-proto": "^1.0.0", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", "get-symbol-description": "^1.1.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", @@ -10247,21 +9113,24 @@ "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", "is-regex": "^1.2.1", + "is-set": "^2.0.3", "is-shared-array-buffer": "^1.0.4", "is-string": "^1.1.1", "is-typed-array": "^1.1.15", - "is-weakref": "^1.1.0", + "is-weakref": "^1.1.1", "math-intrinsics": "^1.1.0", - "object-inspect": "^1.13.3", + "object-inspect": "^1.13.4", "object-keys": "^1.1.1", "object.assign": "^4.1.7", "own-keys": "^1.0.1", - "regexp.prototype.flags": "^1.5.3", + "regexp.prototype.flags": "^1.5.4", "safe-array-concat": "^1.1.3", "safe-push-apply": "^1.0.0", "safe-regex-test": "^1.1.0", "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", "string.prototype.trim": "^1.2.10", "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", @@ -10270,7 +9139,7 @@ "typed-array-byte-offset": "^1.0.4", "typed-array-length": "^1.0.7", "unbox-primitive": "^1.1.0", - "which-typed-array": "^1.1.18" + "which-typed-array": "^1.1.19" }, "engines": { "node": ">= 0.4" @@ -10283,6 +9152,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -10291,6 +9161,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -10299,12 +9170,14 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/es-object-atoms": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", "dependencies": { "es-errors": "^1.3.0" }, @@ -10316,6 +9189,8 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", @@ -10331,6 +9206,7 @@ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", "dev": true, + "license": "MIT", "dependencies": { "is-callable": "^1.2.7", "is-date-object": "^1.0.5", @@ -10344,10 +9220,11 @@ } }, "node_modules/esbuild": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.3.tgz", - "integrity": "sha512-qKA6Pvai73+M2FtftpNKRxJ78GIjmFXFxd/1DVBqGo/qNhLSfv+G12n9pNoWdytJC8U00TrViOwpjT0zgqQS8Q==", + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.10.tgz", + "integrity": "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==", "hasInstallScript": true, + "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -10355,31 +9232,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.3", - "@esbuild/android-arm": "0.25.3", - "@esbuild/android-arm64": "0.25.3", - "@esbuild/android-x64": "0.25.3", - "@esbuild/darwin-arm64": "0.25.3", - "@esbuild/darwin-x64": "0.25.3", - "@esbuild/freebsd-arm64": "0.25.3", - "@esbuild/freebsd-x64": "0.25.3", - "@esbuild/linux-arm": "0.25.3", - "@esbuild/linux-arm64": "0.25.3", - "@esbuild/linux-ia32": "0.25.3", - "@esbuild/linux-loong64": "0.25.3", - "@esbuild/linux-mips64el": "0.25.3", - "@esbuild/linux-ppc64": "0.25.3", - "@esbuild/linux-riscv64": "0.25.3", - "@esbuild/linux-s390x": "0.25.3", - "@esbuild/linux-x64": "0.25.3", - "@esbuild/netbsd-arm64": "0.25.3", - "@esbuild/netbsd-x64": "0.25.3", - "@esbuild/openbsd-arm64": "0.25.3", - "@esbuild/openbsd-x64": "0.25.3", - "@esbuild/sunos-x64": "0.25.3", - "@esbuild/win32-arm64": "0.25.3", - "@esbuild/win32-ia32": "0.25.3", - "@esbuild/win32-x64": "0.25.3" + "@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": { @@ -10387,32 +9265,23 @@ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/escape-goat": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", - "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -10421,81 +9290,91 @@ } }, "node_modules/eslint": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", - "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", - "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "version": "9.37.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.37.0.tgz", + "integrity": "sha512-XyLmROnACWqSxiGYArdef1fItQd47weqB7iwtfr9JHwRrqIXZdcFMvvEcL9xHCmL0SNsOvF0c42lWyM1U5dgig==", "dev": true, + "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.1", - "@humanwhocodes/config-array": "^0.13.0", + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.0", + "@eslint/config-helpers": "^0.4.0", + "@eslint/core": "^0.16.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.37.0", + "@eslint/plugin-kit": "^0.4.0", + "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", + "cross-spawn": "^7.0.6", "debug": "^4.3.2", - "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", + "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" + "optionator": "^0.9.3" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } } }, "node_modules/eslint-config-prettier": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", - "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "version": "10.1.8", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", + "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", "dev": true, + "license": "MIT", "bin": { "eslint-config-prettier": "bin/cli.js" }, + "funding": { + "url": "https://opencollective.com/eslint-config-prettier" + }, "peerDependencies": { "eslint": ">=7.0.0" } }, "node_modules/eslint-plugin-prettier": { - "version": "5.2.6", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.6.tgz", - "integrity": "sha512-mUcf7QG2Tjk7H055Jk0lGBjbgDnfrvqjhXh9t2xLMSCjZVcw9Rb1V6sVNXO0th3jgeO7zllWPTNRil3JW94TnQ==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.4.tgz", + "integrity": "sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg==", "dev": true, + "license": "MIT", "dependencies": { "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.11.0" + "synckit": "^0.11.7" }, "engines": { "node": "^14.18.0 || >=16.0.0" @@ -10519,16 +9398,17 @@ } }, "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -10539,6 +9419,7 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -10551,6 +9432,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -10562,10 +9444,11 @@ } }, "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -10576,6 +9459,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -10587,11 +9471,35 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, "node_modules/eslint/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -10599,20 +9507,12 @@ "node": "*" } }, - "node_modules/esm": { - "version": "3.2.25", - "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", - "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/esno": { "version": "4.8.0", "resolved": "https://registry.npmjs.org/esno/-/esno-4.8.0.tgz", "integrity": "sha512-acMtooReAQGzLU0zcuEDHa8S62meh5aIyi8jboYxyvAePdmuWx2Mpwmt0xjwO0bs9/SXf+dvXJ0QJoDWw814Iw==", "dev": true, + "license": "MIT", "dependencies": { "tsx": "^4.19.1" }, @@ -10621,17 +9521,31 @@ } }, "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.9.0", + "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" + "eslint-visitor-keys": "^4.2.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -10642,6 +9556,7 @@ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, + "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -10655,6 +9570,7 @@ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, @@ -10667,6 +9583,7 @@ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -10679,6 +9596,7 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -10688,6 +9606,7 @@ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "^1.0.0" } @@ -10697,6 +9616,7 @@ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } @@ -10705,29 +9625,24 @@ "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">=6" + "node": ">= 0.6" } }, "node_modules/eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", "engines": { "node": ">=0.8.x" } @@ -10737,6 +9652,7 @@ "resolved": "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz", "integrity": "sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==", "dev": true, + "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", @@ -10755,31 +9671,29 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/execa/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "node_modules/expect-type": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.2.tgz", + "integrity": "sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==", "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=6" + "node": ">=12.0.0" } }, "node_modules/exponential-backoff": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.2.tgz", "integrity": "sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==", - "dev": true + "dev": true, + "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==", + "dev": true, + "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", @@ -10825,6 +9739,8 @@ "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" } @@ -10832,12 +9748,16 @@ "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==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "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==", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.0.6" }, @@ -10849,46 +9769,32 @@ } }, "node_modules/exsolve": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.5.tgz", - "integrity": "sha512-pz5dvkYYKQ1AHVrgOzBKWeP4u4FRb3a6DNK2ucr0OoNwYIU4QWsJ+NM36LLzORT+z845MzKHHhpXiUF5nvQoJg==", - "dev": true - }, - "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==", - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.7.tgz", + "integrity": "sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==", + "dev": true, + "license": "MIT" }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" }, "node_modules/fast-diff": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", - "dev": true - }, - "node_modules/fast-fifo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/fast-glob": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -10905,6 +9811,7 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -10916,30 +9823,21 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fast-memoize": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/fast-memoize/-/fast-memoize-2.5.2.tgz", - "integrity": "sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw==", - "dev": true - }, - "node_modules/fast-safe-stringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-uri": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", - "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "dev": true, "funding": [ { "type": "github", @@ -10949,31 +9847,29 @@ "type": "opencollective", "url": "https://opencollective.com/fastify" } - ] - }, - "node_modules/fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", - "dev": true, - "engines": { - "node": ">= 4.9.1" - } + ], + "license": "BSD-3-Clause" }, "node_modules/fastq": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", "dev": true, + "license": "ISC", "dependencies": { "reusify": "^1.0.4" } }, + "node_modules/feathers": { + "resolved": "packages/feathers", + "link": true + }, "node_modules/figures": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", "dev": true, + "license": "MIT", "dependencies": { "escape-string-regexp": "^1.0.5" }, @@ -10989,33 +9885,30 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.0" } }, "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, + "license": "MIT", "dependencies": { - "flat-cache": "^3.0.4" + "flat-cache": "^4.0.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16.0.0" } }, - "node_modules/file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true - }, "node_modules/filelist": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", "dev": true, + "license": "Apache-2.0", "dependencies": { "minimatch": "^5.0.1" } @@ -11025,6 +9918,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -11037,6 +9931,7 @@ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -11048,6 +9943,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-5.1.0.tgz", "integrity": "sha512-qWeTREPoT7I0bifpPUXtxkZJ1XJzxWtfoWWkdVGqa+eCr3SHW/Ocp89o8vLvbUuQnadybJpjOKu4V+RwO6sGng==", + "license": "MIT", "engines": { "node": ">=14.16" }, @@ -11059,6 +9955,8 @@ "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", @@ -11076,6 +9974,8 @@ "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" } @@ -11083,54 +9983,16 @@ "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==" - }, - "node_modules/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" - } - }, - "node_modules/find-cache-dir/node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-cache-dir/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true, - "bin": { - "semver": "bin/semver.js" - } + "license": "MIT" }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -11147,55 +10009,61 @@ "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", "dev": true, + "license": "BSD-3-Clause", "bin": { "flat": "cli.js" } }, "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, + "license": "MIT", "dependencies": { "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" + "keyv": "^4.5.4" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16" } }, "node_modules/flatted": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/flexsearch": { "version": "0.7.43", "resolved": "https://registry.npmjs.org/flexsearch/-/flexsearch-0.7.43.tgz", "integrity": "sha512-c5o/+Um8aqCSOXGcZoqZOm+NqtVwNsvVpWv6lfmSclU954O3wvQKxxK8zj74fPaSJbXpSLTs4PRhh+wnoCXnKg==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/focus-trap": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.6.4.tgz", - "integrity": "sha512-xx560wGBk7seZ6y933idtjJQc1l+ck+pI3sKvhKozdBV1dRZoKhkW5xoCaFv9tQiX5RH1xfSxjuNu6g+lmN/gw==", + "version": "7.6.5", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.6.5.tgz", + "integrity": "sha512-7Ke1jyybbbPZyZXFxEftUtxFGLMpE2n6A+z//m4CRDlj0hW+o3iYSmh8nFlYMurOiJVDmJRilUQtJr08KfIxlg==", "dev": true, + "license": "MIT", "dependencies": { "tabbable": "^6.2.0" } }, "node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "dev": true, "funding": [ { "type": "individual", "url": "https://github.com/sponsors/RubenVerborgh" } ], + "license": "MIT", "engines": { "node": ">=4.0" }, @@ -11210,6 +10078,7 @@ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", "dev": true, + "license": "MIT", "dependencies": { "is-callable": "^1.2.7" }, @@ -11225,6 +10094,7 @@ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", "dev": true, + "license": "ISC", "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" @@ -11236,10 +10106,24 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/form-data": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "dev": true, "license": "MIT", "dependencies": { "asynckit": "^0.4.0", @@ -11252,50 +10136,22 @@ "node": ">= 6" } }, - "node_modules/form-data-encoder": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", - "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", - "dev": true, - "engines": { - "node": ">= 14.17" - } - }, - "node_modules/formidable": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.5.tgz", - "integrity": "sha512-Oz5Hwvwak/DCaXVVUtPn4oLMLLy1CdclLKO1LFgU7XzDpVMUU5UjlSLpGMocyQNNk8F6IJW9M/YdooSn2MRI+Q==", - "dependencies": { - "@paralleldrive/cuid2": "^2.2.2", - "dezalgo": "^1.0.4", - "once": "^1.4.0", - "qs": "^6.11.0" - }, - "funding": { - "url": "https://ko-fi.com/tunnckoCore/commissions" - } - }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fp-and-or": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/fp-and-or/-/fp-and-or-0.1.4.tgz", - "integrity": "sha512-+yRYRhpnFPWXSly/6V4Lw9IfOV26uu30kynGJ03PW+MnjOEQe45RZ141QcS0aJehYBYA50GfCDnsRbFJdhssRw==", "dev": true, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">= 0.6" } }, "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" } @@ -11305,6 +10161,7 @@ "resolved": "https://registry.npmjs.org/front-matter/-/front-matter-4.0.2.tgz", "integrity": "sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==", "dev": true, + "license": "MIT", "dependencies": { "js-yaml": "^3.13.1" } @@ -11314,6 +10171,7 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, + "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } @@ -11323,6 +10181,7 @@ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -11331,23 +10190,19 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/front-matter/node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, "node_modules/fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fs-extra": { - "version": "11.3.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", - "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", + "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": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -11362,6 +10217,7 @@ "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", "dev": true, + "license": "ISC", "dependencies": { "minipass": "^7.0.3" }, @@ -11373,13 +10229,15 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "hasInstallScript": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -11392,6 +10250,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -11401,6 +10260,7 @@ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", @@ -11421,41 +10281,27 @@ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/gauge": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", - "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", - "deprecated": "This package is no longer supported.", + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", "dev": true, - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, + "license": "MIT", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">= 0.4" } }, - "node_modules/gauge/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -11465,6 +10311,7 @@ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, + "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -11473,6 +10320,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", @@ -11496,22 +10344,15 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", - "dev": true - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, - "engines": { - "node": ">=8.0.0" - } + "license": "ISC" }, "node_modules/get-pkg-repo": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-4.2.1.tgz", "integrity": "sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==", "dev": true, + "license": "MIT", "dependencies": { "@hutson/parse-repository-url": "^3.0.0", "hosted-git-info": "^4.0.0", @@ -11530,6 +10371,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -11545,6 +10387,7 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, + "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -11556,6 +10399,7 @@ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", "dev": true, + "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -11568,6 +10412,7 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -11580,6 +10425,7 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -11597,6 +10443,7 @@ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, + "license": "MIT", "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", @@ -11615,6 +10462,7 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true, + "license": "ISC", "engines": { "node": ">=10" } @@ -11624,6 +10472,7 @@ "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz", "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -11635,6 +10484,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" @@ -11643,23 +10493,12 @@ "node": ">= 0.4" } }, - "node_modules/get-stdin": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", - "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/get-stream": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.0.tgz", "integrity": "sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -11672,6 +10511,7 @@ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", @@ -11685,9 +10525,10 @@ } }, "node_modules/get-tsconfig": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.0.tgz", - "integrity": "sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.12.0.tgz", + "integrity": "sha512-LScr2aNr2FbjAjZh2C6X6BxRx1/x+aTDExct/xyq2XKbYOiG5c0aK7pMsSuyc0brz3ibr/lbQiHD9jzt4lccJw==", + "license": "MIT", "dependencies": { "resolve-pkg-maps": "^1.0.0" }, @@ -11695,17 +10536,12 @@ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, - "node_modules/getopts": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/getopts/-/getopts-2.3.0.tgz", - "integrity": "sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA==", - "dev": true - }, "node_modules/git-raw-commits": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-3.0.0.tgz", "integrity": "sha512-b5OHmZ3vAgGrDn/X0kS+9qCfNKWe4K/jFnhwzVWWg0/k5eLa3060tZShrRg8Dja5kPc+YjS0Gc6y7cRr44Lpjw==", "dev": true, + "license": "MIT", "dependencies": { "dargs": "^7.0.0", "meow": "^8.1.2", @@ -11723,6 +10559,7 @@ "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", "integrity": "sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==", "dev": true, + "license": "MIT", "dependencies": { "gitconfiglocal": "^1.0.0", "pify": "^2.3.0" @@ -11736,6 +10573,7 @@ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -11745,6 +10583,7 @@ "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-5.0.1.tgz", "integrity": "sha512-hIvOeZwRbQ+7YEUmCkHqo8FOLQZCEn18yevLHADlFPZY02KJGsu5FZt9YW/lybfK2uhWFI7Qg/07LekJiTv7iA==", "dev": true, + "license": "MIT", "dependencies": { "meow": "^8.1.2", "semver": "^7.0.0" @@ -11761,6 +10600,7 @@ "resolved": "https://registry.npmjs.org/git-up/-/git-up-7.0.0.tgz", "integrity": "sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==", "dev": true, + "license": "MIT", "dependencies": { "is-ssh": "^1.4.0", "parse-url": "^8.1.0" @@ -11771,6 +10611,7 @@ "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-14.0.0.tgz", "integrity": "sha512-NnLweV+2A4nCvn4U/m2AoYu0pPKlsmhK9cknG7IMwsjFY1S2jxM+mAhsDxyxfCIGfGaD+dozsyX4b6vkYc83yQ==", "dev": true, + "license": "MIT", "dependencies": { "git-up": "^7.0.0" } @@ -11780,21 +10621,17 @@ "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", "integrity": "sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==", "dev": true, + "license": "BSD", "dependencies": { "ini": "^1.3.2" } }, - "node_modules/github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", - "dev": true - }, "node_modules/glob": { "version": "10.4.5", "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, + "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", @@ -11815,6 +10652,7 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -11826,54 +10664,17 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true - }, - "node_modules/global-dirs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", - "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", - "dev": true, - "dependencies": { - "ini": "2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/global-dirs/node_modules/ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", "dev": true, - "engines": { - "node": ">=10" - } + "license": "BSD-2-Clause" }, "node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globals/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -11884,6 +10685,7 @@ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, + "license": "MIT", "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" @@ -11895,30 +10697,11 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -11926,112 +10709,19 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/got": { - "version": "12.6.1", - "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", - "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", - "dev": true, - "dependencies": { - "@sindresorhus/is": "^5.2.0", - "@szmarczak/http-timer": "^5.0.1", - "cacheable-lookup": "^7.0.0", - "cacheable-request": "^10.2.8", - "decompress-response": "^6.0.0", - "form-data-encoder": "^2.1.2", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/got/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "node_modules/grant": { - "version": "5.4.24", - "resolved": "https://registry.npmjs.org/grant/-/grant-5.4.24.tgz", - "integrity": "sha512-PD5AvSI7wgCBDi2mEd6M/TIe+70c/fVc3Ik4B0s4mloWTy9J800eUEcxivOiyqSP9wvBy2QjWq1JR8gOfDMnEg==", - "dependencies": { - "qs": "^6.14.0", - "request-compose": "^2.1.7", - "request-oauth": "^1.0.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "optionalDependencies": { - "cookie": "^0.7.2", - "cookie-signature": "^1.2.2", - "jwk-to-pem": "^2.0.7", - "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==", - "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==", - "optional": true, - "engines": { - "node": ">=6.6.0" - } - }, - "node_modules/grant/node_modules/jwa": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", - "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", - "optional": true, - "dependencies": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/grant/node_modules/jws": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", - "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", - "optional": true, - "dependencies": { - "jwa": "^2.0.0", - "safe-buffer": "^5.0.1" - } + "dev": true, + "license": "ISC" }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/gzip-size": { "version": "6.0.0", @@ -12053,13 +10743,15 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/handlebars": { "version": "4.7.8", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", "dev": true, + "license": "MIT", "dependencies": { "minimist": "^1.2.5", "neo-async": "^2.6.2", @@ -12081,6 +10773,7 @@ "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -12090,6 +10783,7 @@ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -12101,6 +10795,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", "engines": { "node": ">=8" } @@ -12110,6 +10805,7 @@ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, + "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" }, @@ -12122,6 +10818,7 @@ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", "dev": true, + "license": "MIT", "dependencies": { "dunder-proto": "^1.0.0" }, @@ -12136,6 +10833,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -12147,6 +10845,8 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" }, @@ -12161,34 +10861,14 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "dev": true - }, - "node_modules/has-yarn": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz", - "integrity": "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==", "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "optional": true, - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } + "license": "ISC" }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -12200,6 +10880,7 @@ "version": "9.0.5", "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", @@ -12222,6 +10903,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0" }, @@ -12230,37 +10912,19 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "bin": { - "he": "bin/he" - } - }, - "node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", - "optional": true, - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, "node_modules/hookable": { "version": "5.5.3", "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/hosted-git-info": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", "dev": true, + "license": "ISC", "dependencies": { "lru-cache": "^10.0.1" }, @@ -12273,6 +10937,7 @@ "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", "dev": true, + "license": "MIT", "dependencies": { "inherits": "^2.0.1", "obuf": "^1.0.0", @@ -12285,6 +10950,7 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, + "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -12299,13 +10965,15 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/hpack.js/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, + "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" } @@ -12314,76 +10982,39 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/html-void-elements": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/http-assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.5.0.tgz", - "integrity": "sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==", - "dependencies": { - "deep-equal": "~1.0.1", - "http-errors": "~1.8.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-assert/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/http-assert/node_modules/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/http-assert/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "dev": true + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "dev": true, + "license": "BSD-2-Clause" }, "node_modules/http-deceiver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "license": "MIT", "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", @@ -12400,6 +11031,7 @@ "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": { "agent-base": "^7.1.0", "debug": "^4.3.4" @@ -12408,36 +11040,12 @@ "node": ">= 14" } }, - "node_modules/http2-wrapper": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", - "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", - "dev": true, - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "node_modules/http2-wrapper/node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/https-localhost": { "version": "4.7.1", "resolved": "https://registry.npmjs.org/https-localhost/-/https-localhost-4.7.1.tgz", "integrity": "sha512-rl+NFV0l67/0W7fZwk4LB5gS6HdhtSFLpCpf1N+KD5WQAXtPXX1QE8H0cP8VNJii18rtpTkE9eAHdUfJ0goAnQ==", "dev": true, + "license": "AGPL-3.0", "dependencies": { "appdata-path": "^1.0.0", "compression": "^1.7.4", @@ -12455,6 +11063,7 @@ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "dev": true, + "license": "MIT", "dependencies": { "agent-base": "^7.1.2", "debug": "4" @@ -12468,35 +11077,33 @@ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=10.17.0" } }, - "node_modules/humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "dev": true, - "dependencies": { - "ms": "^2.0.0" - } - }, "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": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/ieee754": { "version": "1.2.1", @@ -12515,13 +11122,15 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "BSD-3-Clause" }, "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } @@ -12531,6 +11140,7 @@ "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.5.tgz", "integrity": "sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A==", "dev": true, + "license": "ISC", "dependencies": { "minimatch": "^9.0.0" }, @@ -12539,16 +11149,18 @@ } }, "node_modules/immutable": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.1.tgz", - "integrity": "sha512-3jatXi9ObIsPGr3N5hGw/vWWcTkq6hUYhpQz4k0wLC+owqWi/LiugIw9x0EdNZ2yGedKN/HzePiBvaJRXa0Ujg==", - "dev": true + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.3.tgz", + "integrity": "sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg==", + "dev": true, + "license": "MIT" }, "node_modules/import-fresh": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, + "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -12560,20 +11172,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-lazy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", - "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/import-local": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", "dev": true, + "license": "MIT", "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" @@ -12593,6 +11197,7 @@ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.19" } @@ -12602,30 +11207,18 @@ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true - }, - "node_modules/inflation": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/inflation/-/inflation-2.1.0.tgz", - "integrity": "sha512-t54PPJHG1Pp7VQvxyVCJ9mBbjG3Hqryges9bXoOO6GExCPa+//i/d5GSuFtpx3ALLd7lgIAur6zrIlBQyJuMlQ==", - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, + "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -12634,19 +11227,22 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" }, "node_modules/ini": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/init-package-json": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/init-package-json/-/init-package-json-6.0.3.tgz", "integrity": "sha512-Zfeb5ol+H+eqJWHTaGca9BovufyGeIfr4zaaBorPmJBMrJ+KBnN+kQx2ZtXdsotUTgldHmHQV44xvUWOUA7E2w==", "dev": true, + "license": "ISC", "dependencies": { "@npmcli/package-json": "^5.0.0", "npm-package-arg": "^11.0.0", @@ -12661,14 +11257,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", @@ -12687,6 +11284,7 @@ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", "dev": true, + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.2", @@ -12701,19 +11299,17 @@ "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.10" } }, "node_modules/ip-address": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", - "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", - "devOptional": true, - "dependencies": { - "jsbn": "1.1.0", - "sprintf-js": "^1.1.3" - }, + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz", + "integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==", + "dev": true, + "license": "MIT", "engines": { "node": ">= 12" } @@ -12722,6 +11318,8 @@ "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "license": "MIT", "engines": { "node": ">= 0.10" } @@ -12731,6 +11329,7 @@ "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", @@ -12747,13 +11346,15 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/is-async-function": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", "dev": true, + "license": "MIT", "dependencies": { "async-function": "^1.0.0", "call-bound": "^1.0.3", @@ -12773,6 +11374,7 @@ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", "dev": true, + "license": "MIT", "dependencies": { "has-bigints": "^1.0.2" }, @@ -12788,6 +11390,7 @@ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, + "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" }, @@ -12800,6 +11403,7 @@ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" @@ -12816,6 +11420,7 @@ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -12828,6 +11433,7 @@ "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", "dev": true, + "license": "MIT", "dependencies": { "ci-info": "^3.2.0" }, @@ -12840,6 +11446,7 @@ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "dev": true, + "license": "MIT", "dependencies": { "hasown": "^2.0.2" }, @@ -12855,6 +11462,7 @@ "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", @@ -12872,6 +11480,7 @@ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" @@ -12888,6 +11497,7 @@ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "dev": true, + "license": "MIT", "bin": { "is-docker": "cli.js" }, @@ -12903,6 +11513,7 @@ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -12912,6 +11523,7 @@ "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.3" }, @@ -12926,18 +11538,21 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/is-generator-function": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", - "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", "dev": true, + "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "get-proto": "^1.0.0", + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" }, @@ -12953,6 +11568,7 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, + "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -12960,59 +11576,11 @@ "node": ">=0.10.0" } }, - "node_modules/is-inside-container": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", - "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", - "dev": true, - "dependencies": { - "is-docker": "^3.0.0" - }, - "bin": { - "is-inside-container": "cli.js" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-inside-container/node_modules/is-docker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", - "dev": true, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "dev": true, - "dependencies": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-interactive": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "license": "MIT", "engines": { "node": ">=8" } @@ -13021,13 +11589,15 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/is-map": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -13039,18 +11609,20 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", - "dev": true + "dev": true, + "license": "MIT" }, - "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==", + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, + "license": "MIT", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-number": { @@ -13058,6 +11630,7 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -13067,6 +11640,7 @@ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" @@ -13083,15 +11657,7 @@ "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -13101,6 +11667,7 @@ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -13110,6 +11677,7 @@ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, + "license": "MIT", "dependencies": { "isobject": "^3.0.1" }, @@ -13122,6 +11690,7 @@ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "gopd": "^1.2.0", @@ -13140,6 +11709,7 @@ "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -13149,6 +11719,7 @@ "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -13161,6 +11732,7 @@ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.3" }, @@ -13176,6 +11748,7 @@ "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.1.tgz", "integrity": "sha512-JNeu1wQsHjyHgn9NcWTaXq6zWSR6hqE0++zhfZlkFBbScNkyvxCdeV8sRkSBaeLKxmbpR21brail63ACNxJ0Tg==", "dev": true, + "license": "MIT", "dependencies": { "protocols": "^2.0.1" } @@ -13185,6 +11758,7 @@ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -13194,6 +11768,7 @@ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" @@ -13210,6 +11785,7 @@ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "has-symbols": "^1.1.0", @@ -13227,6 +11803,7 @@ "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", "dev": true, + "license": "MIT", "dependencies": { "text-extensions": "^1.0.0" }, @@ -13234,16 +11811,12 @@ "node": ">=0.10.0" } }, - "node_modules/is-type-of": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-type-of/-/is-type-of-2.2.0.tgz", - "integrity": "sha512-72axShMJMnMy5HSU/jLGNOonZD5rWM0MwJSCYpKCTQCbggQZBJO/CLMMVP5HgS8kPSYFBkTysJexsD6NMvGKDQ==" - }, "node_modules/is-typed-array": { "version": "1.1.15", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", "dev": true, + "license": "MIT", "dependencies": { "which-typed-array": "^1.1.16" }, @@ -13254,16 +11827,11 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true - }, "node_modules/is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -13276,6 +11844,7 @@ "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -13288,6 +11857,7 @@ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.3" }, @@ -13303,6 +11873,7 @@ "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" @@ -13319,6 +11890,7 @@ "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz", "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==", "dev": true, + "license": "MIT", "engines": { "node": ">=12.13" }, @@ -13331,6 +11903,7 @@ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, + "license": "MIT", "dependencies": { "is-docker": "^2.0.0" }, @@ -13338,32 +11911,26 @@ "node": ">=8" } }, - "node_modules/is-yarn-global": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz", - "integrity": "sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==", - "dev": true, - "engines": { - "node": ">=12" - } - }, "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -13373,6 +11940,7 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=8" } @@ -13382,6 +11950,7 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^4.0.0", @@ -13391,11 +11960,27 @@ "node": ">=10" } }, + "node_modules/istanbul-lib-source-maps": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", + "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.23", + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/istanbul-reports": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", - "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" @@ -13409,6 +11994,7 @@ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -13420,15 +12006,15 @@ } }, "node_modules/jake": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", - "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", + "version": "10.9.4", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz", + "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "async": "^3.2.3", - "chalk": "^4.0.2", + "async": "^3.2.6", "filelist": "^1.0.4", - "minimatch": "^3.1.2" + "picocolors": "^1.1.1" }, "bin": { "jake": "bin/cli.js" @@ -13437,64 +12023,12 @@ "node": ">=10" } }, - "node_modules/jake/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jake/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/jake/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jake/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/jest-diff": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", @@ -13510,6 +12044,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -13525,6 +12060,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -13541,71 +12077,34 @@ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true, + "license": "MIT", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, "node_modules/jiti": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", - "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", "dev": true, + "license": "MIT", "bin": { "jiti": "lib/jiti-cli.mjs" } }, - "node_modules/jju": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", - "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", - "dev": true - }, - "node_modules/js-md4": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/js-md4/-/js-md4-0.3.2.tgz", - "integrity": "sha512-/GDnfQYsltsjRswQhN9fhv3EMw2sCpUdrdxyWDOUK7eyD++r3gRhzgiQgc/x4MAv2i1iuQ4lxO5mvqM3vj4bwA==", - "dev": true - }, "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", + "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", + "dev": true, + "license": "MIT" }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -13613,17 +12112,12 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/jsbn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", - "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", - "devOptional": true - }, "node_modules/jsesc": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, + "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, @@ -13635,67 +12129,53 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-parse-even-better-errors": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", "dev": true, + "license": "MIT", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/json-parse-helpfulerror": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/json-parse-helpfulerror/-/json-parse-helpfulerror-1.0.3.tgz", - "integrity": "sha512-XgP0FGR77+QhUxjXkwOMkC94k3WtqEBfcnjWqhRd82qTat4SWKRE+9kUnynz/shm3I4ea2+qISvTIeGTNU7kJg==", - "dev": true, - "dependencies": { - "jju": "^1.1.0" - } - }, "node_modules/json-schema": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "dev": true - }, - "node_modules/json-schema-to-ts": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/json-schema-to-ts/-/json-schema-to-ts-3.1.1.tgz", - "integrity": "sha512-+DWg8jCJG2TEnpy7kOm/7/AxaYoaRbjVB4LFZLySZlWn8exGs3A4OLJR966cVvU26N7X9TWxl+Jsw7dzAqKT6g==", - "dependencies": { - "@babel/runtime": "^7.18.3", - "ts-algebra": "^2.0.0" - }, - "engines": { - "node": ">=16" - } + "dev": true, + "license": "(AFL-2.1 OR BSD-3-Clause)" }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-stringify-nice": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz", "integrity": "sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw==", "dev": true, + "license": "ISC", "funding": { "url": "https://github.com/sponsors/isaacs" } @@ -13704,12 +12184,15 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", "bin": { "json5": "lib/cli.js" }, @@ -13721,13 +12204,15 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "dev": true, + "license": "MIT", "dependencies": { "universalify": "^2.0.0" }, @@ -13735,12 +12220,6 @@ "graceful-fs": "^4.1.6" } }, - "node_modules/jsonlines": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsonlines/-/jsonlines-0.1.1.tgz", - "integrity": "sha512-ekDrAGso79Cvf+dtm+mL8OBI2bmAOt3gssYs833De/C9NmIpWDWyUO4zPgB5x2/OhY366dkhgfPMYfwZF7yOZA==", - "dev": true - }, "node_modules/jsonparse": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", @@ -13748,13 +12227,15 @@ "dev": true, "engines": [ "node >= 0.2.0" - ] + ], + "license": "MIT" }, "node_modules/jsonpointer": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -13764,6 +12245,7 @@ "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", "dev": true, + "license": "(MIT OR Apache-2.0)", "dependencies": { "jsonparse": "^1.2.0", "through": ">=2.2.7 <3" @@ -13775,85 +12257,26 @@ "node": "*" } }, - "node_modules/jsonwebtoken": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", - "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", - "dependencies": { - "jws": "^3.2.2", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", - "ms": "^2.1.1", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=12", - "npm": ">=6" - } - }, "node_modules/just-diff": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/just-diff/-/just-diff-6.0.2.tgz", "integrity": "sha512-S59eriX5u3/QhMNq3v/gm8Kd0w8OS6Tz2FS1NG4blv+z0MuQcBRJyFWjdovM0Rad4/P4aUPFtnkNjMjyMlMSYA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/just-diff-apply": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/just-diff-apply/-/just-diff-apply-5.5.0.tgz", "integrity": "sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw==", - "dev": true - }, - "node_modules/jwa": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", - "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", - "dependencies": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jwk-to-pem": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/jwk-to-pem/-/jwk-to-pem-2.0.7.tgz", - "integrity": "sha512-cSVphrmWr6reVchuKQZdfSs4U9c5Y4hwZggPoz6cbVnTpAVgGRpEuQng86IyqLeGZlhTh+c4MAreB6KbdQDKHQ==", - "optional": true, - "dependencies": { - "asn1.js": "^5.3.0", - "elliptic": "^6.6.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jws": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", - "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", - "dependencies": { - "jwa": "^1.4.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/keygrip": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", - "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", - "dependencies": { - "tsscmp": "1.0.6" - }, - "engines": { - "node": ">= 0.6" - } + "dev": true, + "license": "MIT" }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, + "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } @@ -13863,337 +12286,26 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/knex": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/knex/-/knex-3.1.0.tgz", - "integrity": "sha512-GLoII6hR0c4ti243gMs5/1Rb3B+AjwMOfjYm97pu0FOQa7JH56hgBxYf5WK2525ceSbBY1cjeZ9yk99GPMB6Kw==", - "dev": true, - "dependencies": { - "colorette": "2.0.19", - "commander": "^10.0.0", - "debug": "4.3.4", - "escalade": "^3.1.1", - "esm": "^3.2.25", - "get-package-type": "^0.1.0", - "getopts": "2.3.0", - "interpret": "^2.2.0", - "lodash": "^4.17.21", - "pg-connection-string": "2.6.2", - "rechoir": "^0.8.0", - "resolve-from": "^5.0.0", - "tarn": "^3.0.2", - "tildify": "2.0.0" - }, - "bin": { - "knex": "bin/cli.js" - }, - "engines": { - "node": ">=16" - }, - "peerDependenciesMeta": { - "better-sqlite3": { - "optional": true - }, - "mysql": { - "optional": true - }, - "mysql2": { - "optional": true - }, - "pg": { - "optional": true - }, - "pg-native": { - "optional": true - }, - "sqlite3": { - "optional": true - }, - "tedious": { - "optional": true - } - } - }, - "node_modules/knex/node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "dev": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/knex/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/knex/node_modules/interpret": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", - "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "node_modules/kolorist": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", + "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/knex/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "license": "MIT" }, - "node_modules/knex/node_modules/rechoir": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", - "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "node_modules/lerna": { + "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": { - "resolve": "^1.20.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/knex/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/koa": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/koa/-/koa-3.0.1.tgz", - "integrity": "sha512-oDxVkRwPOHhGlxKIDiDB2h+/l05QPtefD7nSqRgDfZt8P+QVYFWjfeK8jANf5O2YXjk8egd7KntvXKYx82wOag==", - "license": "MIT", - "dependencies": { - "accepts": "^1.3.8", - "content-disposition": "~0.5.4", - "content-type": "^1.0.5", - "cookies": "~0.9.1", - "delegates": "^1.0.0", - "destroy": "^1.2.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "fresh": "~0.5.2", - "http-assert": "^1.5.0", - "http-errors": "^2.0.0", - "koa-compose": "^4.1.0", - "mime-types": "^3.0.1", - "on-finished": "^2.4.1", - "parseurl": "^1.3.3", - "statuses": "^2.0.1", - "type-is": "^2.0.1", - "vary": "^1.1.2" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/koa-body": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/koa-body/-/koa-body-6.0.1.tgz", - "integrity": "sha512-M8ZvMD8r+kPHy28aWP9VxL7kY8oPWA+C7ZgCljrCMeaU7uX6wsIQgDHskyrAr9sw+jqnIXyv4Mlxri5R4InIJg==", - "dependencies": { - "@types/co-body": "^6.1.0", - "@types/formidable": "^2.0.5", - "@types/koa": "^2.13.5", - "co-body": "^6.1.0", - "formidable": "^2.0.1", - "zod": "^3.19.1" - } - }, - "node_modules/koa-compose": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz", - "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==" - }, - "node_modules/koa-qs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/koa-qs/-/koa-qs-3.0.0.tgz", - "integrity": "sha512-05IB5KirwMs3heWW26iTz46HuMAtrlrRMus/aNH1BRDocLyF/099EtCB0MIfQpRuT0TISvaTsWwSy2gctIWiGA==", - "dependencies": { - "merge-descriptors": "^1.0.1", - "qs": "^6.9.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/koa-send": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/koa-send/-/koa-send-5.0.1.tgz", - "integrity": "sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ==", - "dependencies": { - "debug": "^4.1.1", - "http-errors": "^1.7.3", - "resolve-path": "^1.4.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/koa-send/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/koa-send/node_modules/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/koa-send/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/koa-session": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/koa-session/-/koa-session-7.0.2.tgz", - "integrity": "sha512-nMWJndLmIuKQMTYPr5NokGQOGD2Aqal5GVi1xAhrQjrrzKq1ASy1WTFVkZ/xhwhtC4KpWi5KdqNYewZo7KJb4w==", - "dependencies": { - "crc": "^3.8.0", - "is-type-of": "^2.2.0", - "zod": "^3.24.1" - }, - "engines": { - "node": ">= 18.19.0" - } - }, - "node_modules/koa-static": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/koa-static/-/koa-static-5.0.0.tgz", - "integrity": "sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ==", - "dependencies": { - "debug": "^3.1.0", - "koa-send": "^5.0.0" - }, - "engines": { - "node": ">= 7.6.0" - } - }, - "node_modules/koa-static/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "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==", - "engines": { - "node": ">= 0.8" - } - }, - "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==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/koa/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==", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "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==", - "dependencies": { - "content-type": "^1.0.5", - "media-typer": "^1.1.0", - "mime-types": "^3.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/kolorist": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", - "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/latest-version": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", - "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==", - "dev": true, - "dependencies": { - "package-json": "^8.1.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lerna": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/lerna/-/lerna-8.2.2.tgz", - "integrity": "sha512-GkqBELTG4k7rfzAwRok2pKBvhNo046Hfwcj7TuhDah3q58/BBBAqvIFLfqEI5fglnNOs6maMSn6/MWjccQE55A==", - "dev": true, - "dependencies": { - "@lerna/create": "8.2.2", + "@lerna/create": "8.2.4", "@npmcli/arborist": "7.5.4", "@npmcli/package-json": "5.2.0", "@npmcli/run-script": "8.1.0", @@ -14220,7 +12332,6 @@ "get-stream": "6.0.0", "git-url-parse": "14.0.0", "glob-parent": "6.0.2", - "globby": "11.1.0", "graceful-fs": "4.2.11", "has-unicode": "2.0.1", "import-local": "3.1.0", @@ -14234,7 +12345,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", @@ -14260,9 +12370,10 @@ "slash": "3.0.0", "ssri": "^10.0.6", "string-width": "^4.2.3", - "strong-log-transformer": "2.1.0", "tar": "6.2.1", "temp-dir": "1.0.0", + "through": "2.3.8", + "tinyglobby": "0.2.12", "typescript": ">=3 < 6", "upath": "2.0.1", "uuid": "^10.0.0", @@ -14286,6 +12397,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -14297,10 +12409,11 @@ } }, "node_modules/lerna/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -14311,6 +12424,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -14327,63 +12441,23 @@ "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", "dev": true, + "license": "ISC", "engines": { "node": ">= 10" } }, - "node_modules/lerna/node_modules/glob": { - "version": "9.3.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", - "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "minimatch": "^8.0.2", - "minipass": "^4.2.4", - "path-scurry": "^1.6.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/lerna/node_modules/glob/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/lerna/node_modules/glob/node_modules/minimatch": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", - "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/lerna/node_modules/inquirer": { - "version": "8.2.6", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.6.tgz", - "integrity": "sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==", + "version": "8.2.7", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.7.tgz", + "integrity": "sha512-UjOaSel/iddGZJ5xP/Eixh6dY1XghiBw4XK13rCCIJcJfyhhoul/7KhLLUGtebEj6GDYM6Vnx/mVsjx2L/mFIA==", "dev": true, + "license": "MIT", "dependencies": { + "@inquirer/external-editor": "^1.0.0", "ansi-escapes": "^4.2.1", "chalk": "^4.1.1", "cli-cursor": "^3.1.0", "cli-width": "^3.0.0", - "external-editor": "^3.0.3", "figures": "^3.0.0", "lodash": "^4.17.21", "mute-stream": "0.0.8", @@ -14404,6 +12478,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -14420,6 +12495,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -14427,68 +12503,39 @@ "node": "*" } }, - "node_modules/lerna/node_modules/minipass": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", - "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/lerna/node_modules/mute-stream": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/lerna/node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/lerna/node_modules/rimraf": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz", - "integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==", - "dev": true, - "dependencies": { - "glob": "^9.2.0" - }, - "bin": { - "rimraf": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/lerna/node_modules/run-async": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.12.0" } }, - "node_modules/lerna/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, "node_modules/leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -14498,6 +12545,7 @@ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -14511,6 +12559,7 @@ "resolved": "https://registry.npmjs.org/libnpmaccess/-/libnpmaccess-8.0.6.tgz", "integrity": "sha512-uM8DHDEfYG6G5gVivVl+yQd4pH3uRclHC59lzIbSvy7b5FEwR+mU49Zq1jEyRtRFv7+M99mUW9S0wL/4laT4lw==", "dev": true, + "license": "ISC", "dependencies": { "npm-package-arg": "^11.0.2", "npm-registry-fetch": "^17.0.1" @@ -14524,6 +12573,7 @@ "resolved": "https://registry.npmjs.org/libnpmpublish/-/libnpmpublish-9.0.9.tgz", "integrity": "sha512-26zzwoBNAvX9AWOPiqqF6FG4HrSCPsHFkQm7nT+xU1ggAujL/eae81RnCv4CJ2In9q9fh10B88sYSzKCUh/Ghg==", "dev": true, + "license": "ISC", "dependencies": { "ci-info": "^4.0.0", "normalize-package-data": "^6.0.1", @@ -14539,9 +12589,9 @@ } }, "node_modules/libnpmpublish/node_modules/ci-info": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.2.0.tgz", - "integrity": "sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz", + "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==", "dev": true, "funding": [ { @@ -14549,6 +12599,7 @@ "url": "https://github.com/sponsors/sibiraj-s" } ], + "license": "MIT", "engines": { "node": ">=8" } @@ -14558,6 +12609,7 @@ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.3.tgz", "integrity": "sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } @@ -14567,6 +12619,7 @@ "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", "dev": true, + "license": "MIT", "dependencies": { "uc.micro": "^2.0.0" } @@ -14576,6 +12629,7 @@ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-6.2.0.tgz", "integrity": "sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.1.15", "parse-json": "^5.0.0", @@ -14591,28 +12645,21 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=8" } }, - "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "dev": true, - "engines": { - "node": ">=6.11.5" - } - }, "node_modules/local-pkg": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.1.1.tgz", - "integrity": "sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.1.2.tgz", + "integrity": "sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==", "dev": true, + "license": "MIT", "dependencies": { "mlly": "^1.7.4", - "pkg-types": "^2.0.1", - "quansync": "^0.2.8" + "pkg-types": "^2.3.0", + "quansync": "^0.2.11" }, "engines": { "node": ">=14" @@ -14626,6 +12673,7 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, @@ -14639,17 +12687,20 @@ "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" }, "node_modules/lodash-es": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "license": "MIT" }, "node_modules/lodash-unified": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/lodash-unified/-/lodash-unified-1.0.3.tgz", "integrity": "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==", + "license": "MIT", "peerDependencies": { "@types/lodash-es": "*", "lodash": "*", @@ -14663,63 +12714,32 @@ "dev": true, "license": "MIT" }, - "node_modules/lodash.includes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" - }, - "node_modules/lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" - }, - "node_modules/lodash.isinteger": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" - }, "node_modules/lodash.ismatch": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", "integrity": "sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==", - "dev": true - }, - "node_modules/lodash.isnumber": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" - }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" + "dev": true, + "license": "MIT" }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" + "dev": true, + "license": "MIT" }, "node_modules/lodash.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "license": "MIT", "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" @@ -14735,6 +12755,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -14749,6 +12770,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -14760,42 +12782,47 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/long-timeout": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/long-timeout/-/long-timeout-0.1.1.tgz", - "integrity": "sha512-BFRuQUqc7x2NWxfJBCyUrN8iYUYznzL9JROmRz1gZ6KlOIgmoD+njPVbb+VNn2nGMKggMsK79iUNErillsrx7w==" - }, - "node_modules/lowercase-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "node_modules/loupe": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", + "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "license": "MIT" }, "node_modules/lru-cache": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/magic-string": { - "version": "0.30.17", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", - "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "version": "0.30.19", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz", + "integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==", + "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" + "@jridgewell/sourcemap-codec": "^1.5.5" } }, - "node_modules/make-dir": { + "node_modules/magicast": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz", + "integrity": "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.25.4", + "@babel/types": "^7.25.4", + "source-map-js": "^1.2.0" + } + }, + "node_modules/make-dir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, + "license": "MIT", "dependencies": { "semver": "^7.5.3" }, @@ -14806,17 +12833,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, "node_modules/make-fetch-happen": { "version": "13.0.1", "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.1.tgz", "integrity": "sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA==", "dev": true, + "license": "ISC", "dependencies": { "@npmcli/agent": "^2.0.0", "cacache": "^18.0.0", @@ -14840,6 +12862,7 @@ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -14851,13 +12874,15 @@ "version": "8.11.1", "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/markdown-it": { "version": "14.1.0", "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^2.0.1", "entities": "^4.4.0", @@ -14874,6 +12899,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -14882,6 +12908,7 @@ "version": "13.2.0", "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", + "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", @@ -14902,18 +12929,22 @@ "version": "2.12.2", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", - "dev": true + "dev": true, + "license": "CC0-1.0" }, "node_modules/mdurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", - "dev": true + "dev": true, + "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==", + "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -14921,18 +12952,15 @@ "node_modules/memoize-one": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", - "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==" - }, - "node_modules/memory-pager": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", - "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==" + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", + "license": "MIT" }, "node_modules/meow": { "version": "8.1.2", "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", "dev": true, + "license": "MIT", "dependencies": { "@types/minimist": "^1.2.0", "camelcase-keys": "^6.2.2", @@ -14958,6 +12986,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -14971,6 +13000,7 @@ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", "dev": true, + "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -14983,6 +13013,7 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -14995,6 +13026,7 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -15007,6 +13039,7 @@ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^4.0.1", "is-core-module": "^2.5.0", @@ -15022,6 +13055,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, + "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -15037,6 +13071,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -15049,6 +13084,7 @@ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dev": true, + "license": "MIT", "dependencies": { "@types/normalize-package-data": "^2.4.0", "normalize-package-data": "^2.5.0", @@ -15064,6 +13100,7 @@ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", "dev": true, + "license": "MIT", "dependencies": { "find-up": "^4.1.0", "read-pkg": "^5.2.0", @@ -15081,6 +13118,7 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=8" } @@ -15089,13 +13127,15 @@ "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/meow/node_modules/read-pkg/node_modules/normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", @@ -15108,6 +13148,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver" } @@ -15117,6 +13158,7 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=8" } @@ -15126,6 +13168,7 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -15138,6 +13181,7 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true, + "license": "ISC", "engines": { "node": ">=10" } @@ -15146,6 +13190,8 @@ "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" } @@ -15154,13 +13200,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } @@ -15169,6 +13217,8 @@ "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" } @@ -15187,6 +13237,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" @@ -15205,7 +13256,8 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-util-sanitize-uri": { "version": "2.0.1", @@ -15221,6 +13273,7 @@ "url": "https://opencollective.com/unified" } ], + "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-encode": "^2.0.0", @@ -15240,7 +13293,8 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromark-util-types": { "version": "2.0.2", @@ -15255,13 +13309,15 @@ "type": "OpenCollective", "url": "https://opencollective.com/unified" } - ] + ], + "license": "MIT" }, "node_modules/micromatch": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, + "license": "MIT", "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -15274,6 +13330,8 @@ "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" }, @@ -15285,6 +13343,8 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -15293,6 +13353,8 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -15304,27 +13366,17 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/mimic-response": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", - "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/min-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -15333,19 +13385,15 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "devOptional": true - }, - "node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", - "optional": true + "dev": true, + "license": "ISC" }, "node_modules/minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -15361,6 +13409,7 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -15370,6 +13419,7 @@ "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", "dev": true, + "license": "MIT", "dependencies": { "arrify": "^1.0.1", "is-plain-obj": "^1.1.0", @@ -15384,6 +13434,7 @@ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, + "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } @@ -15393,6 +13444,7 @@ "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", "dev": true, + "license": "ISC", "dependencies": { "minipass": "^7.0.3" }, @@ -15405,6 +13457,7 @@ "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz", "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==", "dev": true, + "license": "MIT", "dependencies": { "minipass": "^7.0.3", "minipass-sized": "^1.0.3", @@ -15422,6 +13475,7 @@ "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", "dev": true, + "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -15434,28 +13488,7 @@ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-json-stream": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.2.tgz", - "integrity": "sha512-myxeeTm57lYs8pH2nxPzmEEg8DGIgW+9mv6D4JZD2pa81I/OBjeU7PtICXV6c9eRGTA5JMDsuIPUZRCyBMYNhg==", - "dev": true, - "dependencies": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" - } - }, - "node_modules/minipass-json-stream/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -15468,6 +13501,7 @@ "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", "dev": true, + "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -15480,6 +13514,7 @@ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -15492,6 +13527,7 @@ "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", "dev": true, + "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -15504,6 +13540,7 @@ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -15512,16 +13549,18 @@ } }, "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==", - "dev": true + "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" }, "node_modules/minizlib": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", "dev": true, + "license": "MIT", "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" @@ -15535,6 +13574,7 @@ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -15546,13 +13586,15 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, + "license": "MIT", "bin": { "mkdirp": "bin/cmd.js" }, @@ -15560,247 +13602,48 @@ "node": ">=10" } }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true - }, "node_modules/mlly": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.4.tgz", - "integrity": "sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.0.tgz", + "integrity": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==", "dev": true, + "license": "MIT", "dependencies": { - "acorn": "^8.14.0", - "pathe": "^2.0.1", - "pkg-types": "^1.3.0", - "ufo": "^1.5.4" + "acorn": "^8.15.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.1" } }, "node_modules/mlly/node_modules/confbox": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/mlly/node_modules/pkg-types": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", "dev": true, + "license": "MIT", "dependencies": { "confbox": "^0.1.8", "mlly": "^1.7.4", "pathe": "^2.0.1" } }, - "node_modules/mocha": { - "version": "11.7.1", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.7.1.tgz", - "integrity": "sha512-5EK+Cty6KheMS/YLPPMJC64g5V61gIR25KsRItHw6x4hEKT6Njp1n9LOlH4gpevuwMVS66SXaBBpg+RWZkza4A==", - "dev": true, - "license": "MIT", - "dependencies": { - "browser-stdout": "^1.3.1", - "chokidar": "^4.0.1", - "debug": "^4.3.5", - "diff": "^7.0.0", - "escape-string-regexp": "^4.0.0", - "find-up": "^5.0.0", - "glob": "^10.4.5", - "he": "^1.2.0", - "js-yaml": "^4.1.0", - "log-symbols": "^4.1.0", - "minimatch": "^9.0.5", - "ms": "^2.1.3", - "picocolors": "^1.1.1", - "serialize-javascript": "^6.0.2", - "strip-json-comments": "^3.1.1", - "supports-color": "^8.1.1", - "workerpool": "^9.2.0", - "yargs": "^17.7.2", - "yargs-parser": "^21.1.1", - "yargs-unparser": "^2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha.js" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/mocha/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, "node_modules/modify-values": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/mongodb": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.18.0.tgz", - "integrity": "sha512-fO5ttN9VC8P0F5fqtQmclAkgXZxbIkYRTUi1j8JO6IYwvamkhtYDilJr35jOPELR49zqCJgXZWwCtW7B+TM8vQ==", - "license": "Apache-2.0", - "dependencies": { - "@mongodb-js/saslprep": "^1.1.9", - "bson": "^6.10.4", - "mongodb-connection-string-url": "^3.0.0" - }, - "engines": { - "node": ">=16.20.1" - }, - "peerDependencies": { - "@aws-sdk/credential-providers": "^3.188.0", - "@mongodb-js/zstd": "^1.1.0 || ^2.0.0", - "gcp-metadata": "^5.2.0", - "kerberos": "^2.0.1", - "mongodb-client-encryption": ">=6.0.0 <7", - "snappy": "^7.2.2", - "socks": "^2.7.1" - }, - "peerDependenciesMeta": { - "@aws-sdk/credential-providers": { - "optional": true - }, - "@mongodb-js/zstd": { - "optional": true - }, - "gcp-metadata": { - "optional": true - }, - "kerberos": { - "optional": true - }, - "mongodb-client-encryption": { - "optional": true - }, - "snappy": { - "optional": true - }, - "socks": { - "optional": true - } - } - }, - "node_modules/mongodb-connection-string-url": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.2.tgz", - "integrity": "sha512-rMO7CGo/9BFwyZABcKAWL8UJwH/Kc2x0g72uhDWzG48URRax5TCIcJ7Rc3RZqffZzO/Gwff/jyKwCU9TN8gehA==", - "dependencies": { - "@types/whatwg-url": "^11.0.2", - "whatwg-url": "^14.1.0 || ^13.0.0" - } - }, - "node_modules/mongodb-connection-string-url/node_modules/tr46": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", - "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", - "dependencies": { - "punycode": "^2.3.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/mongodb-connection-string-url/node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "engines": { - "node": ">=12" - } - }, - "node_modules/mongodb-connection-string-url/node_modules/whatwg-url": { - "version": "14.2.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", - "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", - "dependencies": { - "tr46": "^5.1.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/mongodb-memory-server": { - "version": "10.1.4", - "resolved": "https://registry.npmjs.org/mongodb-memory-server/-/mongodb-memory-server-10.1.4.tgz", - "integrity": "sha512-+oKQ/kc3CX+816oPFRtaF0CN4vNcGKNjpOQe4bHo/21A3pMD+lC7Xz1EX5HP7siCX4iCpVchDMmCOFXVQSGkUg==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "mongodb-memory-server-core": "10.1.4", - "tslib": "^2.7.0" - }, - "engines": { - "node": ">=16.20.1" - } - }, - "node_modules/mongodb-memory-server-core": { - "version": "10.1.4", - "resolved": "https://registry.npmjs.org/mongodb-memory-server-core/-/mongodb-memory-server-core-10.1.4.tgz", - "integrity": "sha512-o8fgY7ZalEd8pGps43fFPr/hkQu1L8i6HFEGbsTfA2zDOW0TopgpswaBCqDr0qD7ptibyPfB5DmC+UlIxbThzA==", - "dev": true, - "dependencies": { - "async-mutex": "^0.5.0", - "camelcase": "^6.3.0", - "debug": "^4.3.7", - "find-cache-dir": "^3.3.2", - "follow-redirects": "^1.15.9", - "https-proxy-agent": "^7.0.5", - "mongodb": "^6.9.0", - "new-find-package-json": "^2.0.0", - "semver": "^7.6.3", - "tar-stream": "^3.1.7", - "tslib": "^2.7.0", - "yauzl": "^3.1.3" - }, - "engines": { - "node": ">=16.20.1" - } - }, - "node_modules/mongodb-memory-server-core/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mongodb-memory-server-core/node_modules/tar-stream": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", - "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", - "dev": true, - "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" - } - }, "node_modules/mrmime": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", @@ -15814,42 +13657,16 @@ "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/mssql": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/mssql/-/mssql-11.0.1.tgz", - "integrity": "sha512-KlGNsugoT90enKlR8/G36H0kTxPthDhmtNUCwEHvgRza5Cjpjoj+P2X6eMpFUDN7pFrJZsKadL4x990G8RBE1w==", - "dev": true, - "dependencies": { - "@tediousjs/connection-string": "^0.5.0", - "commander": "^11.0.0", - "debug": "^4.3.3", - "rfdc": "^1.3.0", - "tarn": "^3.0.2", - "tedious": "^18.2.1" - }, - "bin": { - "mssql": "bin/mssql" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/mssql/node_modules/commander": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", - "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true, - "engines": { - "node": ">=16" - } + "license": "MIT" }, "node_modules/multimatch": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-5.0.0.tgz", "integrity": "sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==", "dev": true, + "license": "MIT", "dependencies": { "@types/minimatch": "^3.0.3", "array-differ": "^3.0.0", @@ -15869,15 +13686,17 @@ "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/multimatch/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -15888,6 +13707,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -15899,55 +13719,11 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/mysql": { - "version": "2.18.1", - "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.18.1.tgz", - "integrity": "sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig==", - "dev": true, - "dependencies": { - "bignumber.js": "9.0.0", - "readable-stream": "2.3.7", - "safe-buffer": "5.1.2", - "sqlstring": "2.3.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mysql/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/mysql/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/mysql/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/nanoid": { "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", @@ -15958,6 +13734,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -15965,28 +13742,19 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/napi-build-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", - "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", - "dev": true - }, - "node_modules/native-duplexpair": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/native-duplexpair/-/native-duplexpair-1.0.0.tgz", - "integrity": "sha512-E7QQoM+3jvNtlmyfqRZ0/U75VFgCls+fSkbml2MpgWkWyz3ox8Y58gNhfuziuQYGNNQAbFZJQck55LHCnCK6CA==", - "dev": true - }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/negotiator": { "version": "0.6.4", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -15995,49 +13763,22 @@ "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "node_modules/new-find-package-json": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/new-find-package-json/-/new-find-package-json-2.0.0.tgz", - "integrity": "sha512-lDcBsjBSMlj3LXH2v/FW3txlh2pYTjmbOXPYJD93HI5EwuLzI11tdHSIpUMmfq/IOsldj4Ps8M8flhm+pCK4Ew==", "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">=12.22.0" - } + "license": "MIT" }, "node_modules/nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node_modules/node-abi": { - "version": "3.75.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.75.0.tgz", - "integrity": "sha512-OhYaY5sDsIka7H7AtijtI9jwGYLyl29eQn/W623DiN/MIv5sUqc4g7BIDThX+gb7di9f6xK02nkp8sdfFWZLTg==", "dev": true, - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-addon-api": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", - "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", - "dev": true + "license": "MIT" }, "node_modules/node-fetch": { "version": "2.6.7", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", "dev": true, + "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -16054,9 +13795,9 @@ } }, "node_modules/node-fetch-native": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.6.tgz", - "integrity": "sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==", + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.7.tgz", + "integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==", "dev": true, "license": "MIT" }, @@ -16065,6 +13806,7 @@ "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.3.1.tgz", "integrity": "sha512-Pp3nFHBThHzVtNY7U6JfPjvT/DTE8+o/4xKsLQtBoU+j2HLsGlhcfzflAoUreaJbNmYnX+LlLi0qjV8kpyO6xQ==", "dev": true, + "license": "MIT", "dependencies": { "env-paths": "^2.2.0", "exponential-backoff": "^3.1.1", @@ -16089,6 +13831,7 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", "dev": true, + "license": "ISC", "engines": { "node": ">=16" } @@ -16098,6 +13841,7 @@ "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^3.1.1" }, @@ -16112,19 +13856,22 @@ "version": "1.1.12", "resolved": "https://registry.npmjs.org/node-machine-id/-/node-machine-id-1.1.12.tgz", "integrity": "sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", - "dev": true + "version": "2.0.23", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.23.tgz", + "integrity": "sha512-cCmFDMSm26S6tQSDpBCg/NR8NENrVPhAJSf+XbxBG4rPFaaonlEoE9wHQmun+cls499TQGSb7ZyPBRlzgKfpeg==", + "dev": true, + "license": "MIT" }, "node_modules/nopt": { "version": "7.2.1", "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz", "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==", "dev": true, + "license": "ISC", "dependencies": { "abbrev": "^2.0.0" }, @@ -16140,6 +13887,7 @@ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz", "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^7.0.0", "semver": "^7.3.5", @@ -16154,32 +13902,23 @@ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/normalize-url": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.1.tgz", - "integrity": "sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/normalize-wheel-es": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz", - "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==" + "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==", + "license": "BSD-3-Clause" }, "node_modules/npm-bundled": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.1.tgz", "integrity": "sha512-+AvaheE/ww1JEwRHOrn4WHNzOxGtVp+adrg2AeZS/7KuxGUYFuBta98wYpfHBbJp6Tg6j1NKSEVHNcfZzJHQwQ==", "dev": true, + "license": "ISC", "dependencies": { "npm-normalize-package-bin": "^3.0.0" }, @@ -16188,2410 +13927,2092 @@ } }, "node_modules/npm-check-updates": { - "version": "16.14.20", - "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-16.14.20.tgz", - "integrity": "sha512-sYbIhun4DrjO7NFOTdvs11nCar0etEhZTsEjL47eM0TuiGMhmYughRCxG2SpGRmGAQ7AkwN7bw2lWzoE7q6yOQ==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-18.3.1.tgz", + "integrity": "sha512-5HwKPq7ybOOA1xB4FZg/1ToZZ5/i93U8m3co1mb3GYZAZPDkcxEFukQTTp/Abym+ZY6ShfrHl45Y0rCcwsNnQA==", "dev": true, - "dependencies": { - "@types/semver-utils": "^1.1.1", - "chalk": "^5.3.0", - "cli-table3": "^0.6.3", - "commander": "^10.0.1", - "fast-memoize": "^2.5.2", - "find-up": "5.0.0", - "fp-and-or": "^0.1.4", - "get-stdin": "^8.0.0", - "globby": "^11.0.4", - "hosted-git-info": "^5.1.0", - "ini": "^4.1.1", - "js-yaml": "^4.1.0", - "json-parse-helpfulerror": "^1.0.3", - "jsonlines": "^0.1.1", - "lodash": "^4.17.21", - "make-fetch-happen": "^11.1.1", - "minimatch": "^9.0.3", - "p-map": "^4.0.0", - "pacote": "15.2.0", - "parse-github-url": "^1.0.2", - "progress": "^2.0.3", - "prompts-ncu": "^3.0.0", - "rc-config-loader": "^4.1.3", - "remote-git-tags": "^3.0.0", - "rimraf": "^5.0.5", - "semver": "^7.5.4", - "semver-utils": "^1.1.4", - "source-map-support": "^0.5.21", - "spawn-please": "^2.0.2", - "strip-ansi": "^7.1.0", - "strip-json-comments": "^5.0.1", - "untildify": "^4.0.0", - "update-notifier": "^6.0.2" - }, + "license": "Apache-2.0", "bin": { - "ncu": "build/src/bin/cli.js", - "npm-check-updates": "build/src/bin/cli.js" + "ncu": "build/cli.js", + "npm-check-updates": "build/cli.js" }, "engines": { - "node": ">=14.14" + "node": "^18.18.0 || >=20.0.0", + "npm": ">=8.12.1" } }, - "node_modules/npm-check-updates/node_modules/@npmcli/git": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.1.0.tgz", - "integrity": "sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==", + "node_modules/npm-install-checks": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz", + "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "@npmcli/promise-spawn": "^6.0.0", - "lru-cache": "^7.4.4", - "npm-pick-manifest": "^8.0.0", - "proc-log": "^3.0.0", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^3.0.0" + "semver": "^7.1.1" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm-check-updates/node_modules/@npmcli/promise-spawn": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz", - "integrity": "sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==", + "node_modules/npm-normalize-package-bin": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", + "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", "dev": true, - "dependencies": { - "which": "^3.0.0" - }, + "license": "ISC", "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm-check-updates/node_modules/@npmcli/run-script": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-6.0.2.tgz", - "integrity": "sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==", + "node_modules/npm-package-arg": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.2.tgz", + "integrity": "sha512-IGN0IAwmhDJwy13Wc8k+4PEbTPhpJnMtfR53ZbOyjkvmEcLS4nCwp6mvMWjS5sUjeiW3mpx6cHmuhKEu9XmcQw==", "dev": true, + "license": "ISC", "dependencies": { - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/promise-spawn": "^6.0.0", - "node-gyp": "^9.0.0", - "read-package-json-fast": "^3.0.0", - "which": "^3.0.0" + "hosted-git-info": "^7.0.0", + "proc-log": "^4.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/npm-check-updates/node_modules/@sigstore/bundle": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-1.1.0.tgz", - "integrity": "sha512-PFutXEy0SmQxYI4texPw3dd2KewuNqv7OuK1ZFtY2fM754yhvG2KdgwIhRnoEE2uHdtdGNQ8s0lb94dW9sELog==", + "node_modules/npm-packlist": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-8.0.2.tgz", + "integrity": "sha512-shYrPFIS/JLP4oQmAwDyk5HcyysKW8/JLTEA32S0Z5TzvpaeeX2yMFfoK1fjEBnCBvVyIB/Jj/GBFdm0wsgzbA==", "dev": true, + "license": "ISC", "dependencies": { - "@sigstore/protobuf-specs": "^0.2.0" + "ignore-walk": "^6.0.4" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm-check-updates/node_modules/@sigstore/protobuf-specs": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.2.1.tgz", - "integrity": "sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A==", + "node_modules/npm-pick-manifest": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-9.1.0.tgz", + "integrity": "sha512-nkc+3pIIhqHVQr085X9d2JzPzLyjzQS96zbruppqC9aZRm/x8xx6xhI98gHtsfELP2bE+loHq8ZaHFHhe+NauA==", "dev": true, + "license": "ISC", + "dependencies": { + "npm-install-checks": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "npm-package-arg": "^11.0.0", + "semver": "^7.3.5" + }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/npm-check-updates/node_modules/@sigstore/sign": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-1.0.0.tgz", - "integrity": "sha512-INxFVNQteLtcfGmcoldzV6Je0sbbfh9I16DM4yJPw3j5+TFP8X6uIiA18mvpEa9yyeycAKgPmOA3X9hVdVTPUA==", + "node_modules/npm-registry-fetch": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-17.1.0.tgz", + "integrity": "sha512-5+bKQRH0J1xG1uZ1zMNvxW0VEyoNWgJpY9UDuluPFLKDfJ9u2JmmjmTJV1srBGQOROfdBMiVvnH2Zvpbm+xkVA==", "dev": true, + "license": "ISC", "dependencies": { - "@sigstore/bundle": "^1.1.0", - "@sigstore/protobuf-specs": "^0.2.0", - "make-fetch-happen": "^11.0.1" + "@npmcli/redact": "^2.0.0", + "jsonparse": "^1.3.1", + "make-fetch-happen": "^13.0.0", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minizlib": "^2.1.2", + "npm-package-arg": "^11.0.0", + "proc-log": "^4.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/npm-check-updates/node_modules/@sigstore/tuf": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-1.0.3.tgz", - "integrity": "sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg==", + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, + "license": "MIT", "dependencies": { - "@sigstore/protobuf-specs": "^0.2.0", - "tuf-js": "^1.1.7" + "path-key": "^3.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=8" } }, - "node_modules/npm-check-updates/node_modules/@tufjs/canonical-json": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-1.0.0.tgz", - "integrity": "sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==", + "node_modules/nx": { + "version": "20.8.2", + "resolved": "https://registry.npmjs.org/nx/-/nx-20.8.2.tgz", + "integrity": "sha512-mDKpbH3vEpUFDx0rrLh+tTqLq1PYU8KiD/R7OVZGd1FxQxghx2HOl32MiqNsfPcw6AvKlXhslbwIESV+N55FLQ==", "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@napi-rs/wasm-runtime": "0.2.4", + "@yarnpkg/lockfile": "^1.1.0", + "@yarnpkg/parsers": "3.0.2", + "@zkochan/js-yaml": "0.0.7", + "axios": "^1.8.3", + "chalk": "^4.1.0", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "cliui": "^8.0.1", + "dotenv": "~16.4.5", + "dotenv-expand": "~11.0.6", + "enquirer": "~2.3.6", + "figures": "3.2.0", + "flat": "^5.0.2", + "front-matter": "^4.0.2", + "ignore": "^5.0.4", + "jest-diff": "^29.4.1", + "jsonc-parser": "3.2.0", + "lines-and-columns": "2.0.3", + "minimatch": "9.0.3", + "node-machine-id": "1.1.12", + "npm-run-path": "^4.0.1", + "open": "^8.4.0", + "ora": "5.3.0", + "resolve.exports": "2.0.3", + "semver": "^7.5.3", + "string-width": "^4.2.3", + "tar-stream": "~2.2.0", + "tmp": "~0.2.1", + "tsconfig-paths": "^4.1.2", + "tslib": "^2.3.0", + "yaml": "^2.6.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" + }, + "bin": { + "nx": "bin/nx.js", + "nx-cloud": "bin/nx-cloud.js" + }, + "optionalDependencies": { + "@nx/nx-darwin-arm64": "20.8.2", + "@nx/nx-darwin-x64": "20.8.2", + "@nx/nx-freebsd-x64": "20.8.2", + "@nx/nx-linux-arm-gnueabihf": "20.8.2", + "@nx/nx-linux-arm64-gnu": "20.8.2", + "@nx/nx-linux-arm64-musl": "20.8.2", + "@nx/nx-linux-x64-gnu": "20.8.2", + "@nx/nx-linux-x64-musl": "20.8.2", + "@nx/nx-win32-arm64-msvc": "20.8.2", + "@nx/nx-win32-x64-msvc": "20.8.2" + }, + "peerDependencies": { + "@swc-node/register": "^1.8.0", + "@swc/core": "^1.3.85" + }, + "peerDependenciesMeta": { + "@swc-node/register": { + "optional": true + }, + "@swc/core": { + "optional": true + } } }, - "node_modules/npm-check-updates/node_modules/@tufjs/models": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-1.0.4.tgz", - "integrity": "sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==", + "node_modules/nx/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { - "@tufjs/canonical-json": "1.0.0", - "minimatch": "^9.0.0" + "color-convert": "^2.0.1" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/npm-check-updates/node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "node_modules/npm-check-updates/node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "node_modules/nx/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { - "debug": "4" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">= 6.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/npm-check-updates/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "node_modules/nx/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, + "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "node": ">= 4" } }, - "node_modules/npm-check-updates/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/nx/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, + "license": "ISC", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/npm-check-updates/node_modules/cacache": { - "version": "17.1.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", - "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==", - "dev": true, - "dependencies": { - "@npmcli/fs": "^3.1.0", - "fs-minipass": "^3.0.0", - "glob": "^10.2.2", - "lru-cache": "^7.7.1", - "minipass": "^7.0.3", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^4.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11", - "unique-filename": "^3.0.0" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-check-updates/node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "dev": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/npm-check-updates/node_modules/hosted-git-info": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", - "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", - "dev": true, - "dependencies": { - "lru-cache": "^7.5.1" + "node": ">=16 || 14 >=14.17" }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/npm-check-updates/node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "node_modules/nx/node_modules/ora": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.3.0.tgz", + "integrity": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==", "dev": true, + "license": "MIT", "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" + "bl": "^4.0.3", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "log-symbols": "^4.0.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" }, "engines": { - "node": ">= 6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm-check-updates/node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "dev": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, + "license": "MIT", "engines": { - "node": ">= 6" + "node": ">=0.10.0" } }, - "node_modules/npm-check-updates/node_modules/ini": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", - "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==", - "dev": true, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/npm-check-updates/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, + "license": "MIT", "engines": { - "node": ">=12" + "node": ">= 0.4" } }, - "node_modules/npm-check-updates/node_modules/make-fetch-happen": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", - "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", "dev": true, + "license": "MIT", "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", - "http-cache-semantics": "^4.1.1", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^10.0.0" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/npm-check-updates/node_modules/make-fetch-happen/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", "dev": true, - "engines": { - "node": ">=8" - } + "license": "MIT" }, - "node_modules/npm-check-updates/node_modules/minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "node_modules/ofetch": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.4.1.tgz", + "integrity": "sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==", "dev": true, + "license": "MIT", "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" + "destr": "^2.0.3", + "node-fetch-native": "^1.6.4", + "ufo": "^1.5.4" } }, - "node_modules/npm-check-updates/node_modules/minipass-collect/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dev": true, + "license": "MIT", "dependencies": { - "yallist": "^4.0.0" + "ee-first": "1.1.1" }, "engines": { - "node": ">=8" + "node": ">= 0.8" } }, - "node_modules/npm-check-updates/node_modules/node-gyp": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.1.tgz", - "integrity": "sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==", + "node_modules/on-headers": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", "dev": true, - "dependencies": { - "env-paths": "^2.2.0", - "exponential-backoff": "^3.1.1", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", - "nopt": "^6.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, + "license": "MIT", "engines": { - "node": "^12.13 || ^14.13 || >=16" + "node": ">= 0.8" } }, - "node_modules/npm-check-updates/node_modules/node-gyp/node_modules/@npmcli/fs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", - "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, + "license": "ISC", "dependencies": { - "@gar/promisify": "^1.1.3", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "wrappy": "1" } }, - "node_modules/npm-check-updates/node_modules/node-gyp/node_modules/cacache": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", - "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", - "dev": true, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "license": "MIT", "dependencies": { - "@npmcli/fs": "^2.1.0", - "@npmcli/move-file": "^2.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "infer-owner": "^1.0.4", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11", - "unique-filename": "^2.0.0" + "mimic-fn": "^2.1.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm-check-updates/node_modules/node-gyp/node_modules/cacache/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, + "node_modules/oniguruma-parser": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.1.tgz", + "integrity": "sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==", + "license": "MIT" + }, + "node_modules/oniguruma-to-es": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.3.tgz", + "integrity": "sha512-rPiZhzC3wXwE59YQMRDodUwwT9FZ9nNBwQQfsd1wfdtlKEyCdRV0avrTcSZ5xlIvGRVPd/cx6ZN45ECmS39xvg==", + "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "oniguruma-parser": "^0.12.1", + "regex": "^6.0.1", + "regex-recursion": "^6.0.2" } }, - "node_modules/npm-check-updates/node_modules/node-gyp/node_modules/cacache/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", "dev": true, + "license": "MIT", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" }, "engines": { "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm-check-updates/node_modules/node-gyp/node_modules/cacache/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, + "license": "MIT", "dependencies": { - "brace-expansion": "^2.0.1" + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" }, "engines": { - "node": ">=10" + "node": ">= 0.8.0" } }, - "node_modules/npm-check-updates/node_modules/node-gyp/node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "license": "MIT", "dependencies": { - "minipass": "^3.0.0" + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" }, "engines": { - "node": ">= 8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm-check-updates/node_modules/node-gyp/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, + "node_modules/ora/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "color-convert": "^2.0.1" }, "engines": { - "node": "*" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/npm-check-updates/node_modules/node-gyp/node_modules/make-fetch-happen": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", - "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", - "dev": true, + "node_modules/ora/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^16.1.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^9.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/npm-check-updates/node_modules/node-gyp/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", "dev": true, + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" }, "engines": { - "node": "*" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/npm-check-updates/node_modules/node-gyp/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/npm-check-updates/node_modules/node-gyp/node_modules/minipass-fetch": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", - "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, + "license": "MIT", "dependencies": { - "minipass": "^3.1.6", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" + "yocto-queue": "^0.1.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=10" }, - "optionalDependencies": { - "encoding": "^0.1.13" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm-check-updates/node_modules/node-gyp/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, + "license": "MIT", "dependencies": { - "glob": "^7.1.3" + "p-limit": "^3.0.2" }, - "bin": { - "rimraf": "bin.js" + "engines": { + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm-check-updates/node_modules/node-gyp/node_modules/ssri": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", - "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "dev": true, + "license": "MIT", "dependencies": { - "minipass": "^3.1.1" + "aggregate-error": "^3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm-check-updates/node_modules/node-gyp/node_modules/unique-filename": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", - "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", + "node_modules/p-map-series": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map-series/-/p-map-series-2.1.0.tgz", + "integrity": "sha512-RpYIIK1zXSNEOdwxcfe7FdvGcs7+y5n8rifMhMNWvaxRNMPINJHF5GDeuVxWqnfrcHPSCnp7Oo5yNXHId9Av2Q==", "dev": true, - "dependencies": { - "unique-slug": "^3.0.0" - }, + "license": "MIT", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=8" } }, - "node_modules/npm-check-updates/node_modules/node-gyp/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "node_modules/p-pipe": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-pipe/-/p-pipe-3.1.0.tgz", + "integrity": "sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw==", "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, + "license": "MIT", "engines": { - "node": ">= 8" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm-check-updates/node_modules/nopt": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", - "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", + "node_modules/p-queue": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", + "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", "dev": true, + "license": "MIT", "dependencies": { - "abbrev": "^1.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" + "eventemitter3": "^4.0.4", + "p-timeout": "^3.2.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm-check-updates/node_modules/npm-package-arg": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", - "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", + "node_modules/p-reduce": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-2.1.0.tgz", + "integrity": "sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==", "dev": true, - "dependencies": { - "hosted-git-info": "^6.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" - }, + "license": "MIT", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=8" } }, - "node_modules/npm-check-updates/node_modules/npm-package-arg/node_modules/hosted-git-info": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.3.tgz", - "integrity": "sha512-HVJyzUrLIL1c0QmviVh5E8VGyUS7xCFPS6yydaVd1UegW+ibV/CohqTH9MkOLDp5o+rb82DMo77PTuc9F/8GKw==", + "node_modules/p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", "dev": true, + "license": "MIT", "dependencies": { - "lru-cache": "^7.5.1" + "p-finally": "^1.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=8" } }, - "node_modules/npm-check-updates/node_modules/npm-packlist": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-7.0.4.tgz", - "integrity": "sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==", + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, - "dependencies": { - "ignore-walk": "^6.0.0" - }, + "license": "MIT", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=6" } }, - "node_modules/npm-check-updates/node_modules/npm-pick-manifest": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-8.0.2.tgz", - "integrity": "sha512-1dKY+86/AIiq1tkKVD3l0WI+Gd3vkknVGAggsFeBkTvbhMQ1OND/LKkYv4JtXPKUJ8bOTCyLiqEg2P6QNdK+Gg==", + "node_modules/p-waterfall": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-waterfall/-/p-waterfall-2.1.1.tgz", + "integrity": "sha512-RRTnDb2TBG/epPRI2yYXsimO0v3BXC8Yd3ogr1545IaqKK17VGhbWVeGGN+XfCm/08OK8635nH31c8bATkHuSw==", "dev": true, + "license": "MIT", "dependencies": { - "npm-install-checks": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "npm-package-arg": "^10.0.0", - "semver": "^7.3.5" + "p-reduce": "^2.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm-check-updates/node_modules/npm-registry-fetch": { - "version": "14.0.5", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-14.0.5.tgz", - "integrity": "sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==", + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", "dev": true, - "dependencies": { - "make-fetch-happen": "^11.0.0", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.1.2", - "npm-package-arg": "^10.0.0", - "proc-log": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } + "license": "BlueOak-1.0.0" }, - "node_modules/npm-check-updates/node_modules/npm-registry-fetch/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "node_modules/package-manager-detector": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.4.0.tgz", + "integrity": "sha512-rRZ+pR1Usc+ND9M2NkmCvE/LYJS+8ORVV9X0KuNSY/gFsp7RBHJM/ADh9LYq4Vvfq6QkKrW6/weuh8SMEtN5gw==", "dev": true, - "engines": { - "node": ">=8" - } + "license": "MIT" }, - "node_modules/npm-check-updates/node_modules/pacote": { - "version": "15.2.0", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.2.0.tgz", - "integrity": "sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==", + "node_modules/pacote": { + "version": "18.0.6", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-18.0.6.tgz", + "integrity": "sha512-+eK3G27SMwsB8kLIuj4h1FUhHtwiEUo21Tw8wNjmvdlpOEr613edv+8FUsTj/4F/VN5ywGE19X18N7CC2EJk6A==", "dev": true, + "license": "ISC", "dependencies": { - "@npmcli/git": "^4.0.0", + "@npmcli/git": "^5.0.0", "@npmcli/installed-package-contents": "^2.0.1", - "@npmcli/promise-spawn": "^6.0.1", - "@npmcli/run-script": "^6.0.0", - "cacache": "^17.0.0", + "@npmcli/package-json": "^5.1.0", + "@npmcli/promise-spawn": "^7.0.0", + "@npmcli/run-script": "^8.0.0", + "cacache": "^18.0.0", "fs-minipass": "^3.0.0", - "minipass": "^5.0.0", - "npm-package-arg": "^10.0.0", - "npm-packlist": "^7.0.0", - "npm-pick-manifest": "^8.0.0", - "npm-registry-fetch": "^14.0.0", - "proc-log": "^3.0.0", + "minipass": "^7.0.2", + "npm-package-arg": "^11.0.0", + "npm-packlist": "^8.0.0", + "npm-pick-manifest": "^9.0.0", + "npm-registry-fetch": "^17.0.0", + "proc-log": "^4.0.0", "promise-retry": "^2.0.1", - "read-package-json": "^6.0.0", - "read-package-json-fast": "^3.0.0", - "sigstore": "^1.3.0", + "sigstore": "^2.2.0", "ssri": "^10.0.0", "tar": "^6.1.11" }, "bin": { - "pacote": "lib/bin.js" + "pacote": "bin/index.js" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/npm-check-updates/node_modules/pacote/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/npm-check-updates/node_modules/proc-log": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", - "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", - "dev": true, - "engines": { + "node_modules/parse-conflict-json": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/parse-conflict-json/-/parse-conflict-json-3.0.1.tgz", + "integrity": "sha512-01TvEktc68vwbJOtWZluyWeVGWjP+bZwXtPDMQVbBKzbJ/vZBif0L69KH1+cHv1SZ6e0FKLvjyHe8mqsIqYOmw==", + "dev": true, + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^3.0.0", + "just-diff": "^6.0.0", + "just-diff-apply": "^5.2.0" + }, + "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm-check-updates/node_modules/rimraf": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", - "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, + "license": "MIT", "dependencies": { - "glob": "^10.3.7" + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" }, - "bin": { - "rimraf": "dist/esm/bin.mjs" + "engines": { + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm-check-updates/node_modules/sigstore": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.9.0.tgz", - "integrity": "sha512-0Zjz0oe37d08VeOtBIuB6cRriqXse2e8w+7yIy2XSXjshRKxbc2KkhXjL229jXSxEm7UbcjS76wcJDGQddVI9A==", + "node_modules/parse-json/node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/parse-json/node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/parse-path": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.1.0.tgz", + "integrity": "sha512-EuCycjZtfPcjWk7KTksnJ5xPMvWGA/6i4zrLYhRG0hGvC3GPU/jGUj3Cy+ZR0v30duV3e23R95T1lE2+lsndSw==", "dev": true, + "license": "MIT", "dependencies": { - "@sigstore/bundle": "^1.1.0", - "@sigstore/protobuf-specs": "^0.2.0", - "@sigstore/sign": "^1.0.0", - "@sigstore/tuf": "^1.0.3", - "make-fetch-happen": "^11.0.1" - }, - "bin": { - "sigstore": "bin/sigstore.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "protocols": "^2.0.0" } }, - "node_modules/npm-check-updates/node_modules/socks-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", - "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", + "node_modules/parse-url": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-8.1.0.tgz", + "integrity": "sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==", "dev": true, + "license": "MIT", "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - }, - "engines": { - "node": ">= 10" + "parse-path": "^7.0.0" } }, - "node_modules/npm-check-updates/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, + "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": ">= 0.8" } }, - "node_modules/npm-check-updates/node_modules/strip-json-comments": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.1.tgz", - "integrity": "sha512-0fk9zBqO67Nq5M/m45qHCJxylV/DhBlIOVExqgOMiCCrzrhU6tCibRXNqE3jwJLftzE9SNuZtYbpzcO+i9FiKw==", + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, + "license": "MIT", "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/npm-check-updates/node_modules/tuf-js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.7.tgz", - "integrity": "sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==", + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, - "dependencies": { - "@tufjs/models": "1.0.4", - "debug": "^4.3.4", - "make-fetch-happen": "^11.1.1" - }, + "license": "MIT", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=0.10.0" } }, - "node_modules/npm-check-updates/node_modules/unique-slug": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", - "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4" - }, + "license": "MIT", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=8" } }, - "node_modules/npm-check-updates/node_modules/which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", - "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true, + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/which.js" + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/npm-install-checks": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz", - "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==", + "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/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "dev": true, + "license": "MIT", "dependencies": { - "semver": "^7.1.1" + "pify": "^3.0.0" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=4" } }, - "node_modules/npm-normalize-package-bin": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", - "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", + "node_modules/path-type/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", "dev": true, + "license": "MIT", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=4" } }, - "node_modules/npm-package-arg": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.2.tgz", - "integrity": "sha512-IGN0IAwmhDJwy13Wc8k+4PEbTPhpJnMtfR53ZbOyjkvmEcLS4nCwp6mvMWjS5sUjeiW3mpx6cHmuhKEu9XmcQw==", + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", "dev": true, - "dependencies": { - "hosted-git-info": "^7.0.0", - "proc-log": "^4.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } + "license": "MIT" }, - "node_modules/npm-packlist": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-8.0.2.tgz", - "integrity": "sha512-shYrPFIS/JLP4oQmAwDyk5HcyysKW8/JLTEA32S0Z5TzvpaeeX2yMFfoK1fjEBnCBvVyIB/Jj/GBFdm0wsgzbA==", + "node_modules/pathval": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", + "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", "dev": true, - "dependencies": { - "ignore-walk": "^6.0.4" - }, + "license": "MIT", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">= 14.16" } }, - "node_modules/npm-pick-manifest": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-9.1.0.tgz", - "integrity": "sha512-nkc+3pIIhqHVQr085X9d2JzPzLyjzQS96zbruppqC9aZRm/x8xx6xhI98gHtsfELP2bE+loHq8ZaHFHhe+NauA==", + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", "dev": true, - "dependencies": { - "npm-install-checks": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "npm-package-arg": "^11.0.0", - "semver": "^7.3.5" - }, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/npm-registry-fetch": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-17.1.0.tgz", - "integrity": "sha512-5+bKQRH0J1xG1uZ1zMNvxW0VEyoNWgJpY9UDuluPFLKDfJ9u2JmmjmTJV1srBGQOROfdBMiVvnH2Zvpbm+xkVA==", + "node_modules/pify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", + "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", "dev": true, - "dependencies": { - "@npmcli/redact": "^2.0.0", - "jsonparse": "^1.3.1", - "make-fetch-happen": "^13.0.0", - "minipass": "^7.0.2", - "minipass-fetch": "^3.0.0", - "minizlib": "^2.1.2", - "npm-package-arg": "^11.0.0", - "proc-log": "^4.0.0" - }, + "license": "MIT", "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, + "license": "MIT", "dependencies": { - "path-key": "^3.0.0" + "find-up": "^4.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/npmlog": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", - "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", - "deprecated": "This package is no longer supported.", - "dev": true, - "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/nx": { - "version": "20.8.1", - "resolved": "https://registry.npmjs.org/nx/-/nx-20.8.1.tgz", - "integrity": "sha512-73Uw8YXpsjeLqHSl7NMCmGdCs+8ynPzoNJFWAqVanPETEY9zPd5wevVQmeyzYtNNQU35uj6Os4iUzYunmwnFaA==", + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, - "hasInstallScript": true, + "license": "MIT", "dependencies": { - "@napi-rs/wasm-runtime": "0.2.4", - "@yarnpkg/lockfile": "^1.1.0", - "@yarnpkg/parsers": "3.0.2", - "@zkochan/js-yaml": "0.0.7", - "axios": "^1.8.3", - "chalk": "^4.1.0", - "cli-cursor": "3.1.0", - "cli-spinners": "2.6.1", - "cliui": "^8.0.1", - "dotenv": "~16.4.5", - "dotenv-expand": "~11.0.6", - "enquirer": "~2.3.6", - "figures": "3.2.0", - "flat": "^5.0.2", - "front-matter": "^4.0.2", - "ignore": "^5.0.4", - "jest-diff": "^29.4.1", - "jsonc-parser": "3.2.0", - "lines-and-columns": "2.0.3", - "minimatch": "9.0.3", - "node-machine-id": "1.1.12", - "npm-run-path": "^4.0.1", - "open": "^8.4.0", - "ora": "5.3.0", - "resolve.exports": "2.0.3", - "semver": "^7.5.3", - "string-width": "^4.2.3", - "tar-stream": "~2.2.0", - "tmp": "~0.2.1", - "tsconfig-paths": "^4.1.2", - "tslib": "^2.3.0", - "yaml": "^2.6.0", - "yargs": "^17.6.2", - "yargs-parser": "21.1.1" - }, - "bin": { - "nx": "bin/nx.js", - "nx-cloud": "bin/nx-cloud.js" - }, - "optionalDependencies": { - "@nx/nx-darwin-arm64": "20.8.1", - "@nx/nx-darwin-x64": "20.8.1", - "@nx/nx-freebsd-x64": "20.8.1", - "@nx/nx-linux-arm-gnueabihf": "20.8.1", - "@nx/nx-linux-arm64-gnu": "20.8.1", - "@nx/nx-linux-arm64-musl": "20.8.1", - "@nx/nx-linux-x64-gnu": "20.8.1", - "@nx/nx-linux-x64-musl": "20.8.1", - "@nx/nx-win32-arm64-msvc": "20.8.1", - "@nx/nx-win32-x64-msvc": "20.8.1" - }, - "peerDependencies": { - "@swc-node/register": "^1.8.0", - "@swc/core": "^1.3.85" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, - "peerDependenciesMeta": { - "@swc-node/register": { - "optional": true - }, - "@swc/core": { - "optional": true - } + "engines": { + "node": ">=8" } }, - "node_modules/nx/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, + "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "p-locate": "^4.1.0" }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/nx/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "p-try": "^2.0.0" }, "engines": { - "node": ">=10" + "node": ">=6" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/nx/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, + "license": "MIT", "dependencies": { - "brace-expansion": "^2.0.1" + "p-limit": "^2.2.0" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=8" } }, - "node_modules/nx/node_modules/ora": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.3.0.tgz", - "integrity": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==", + "node_modules/pkg-types": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz", + "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==", "dev": true, + "license": "MIT", "dependencies": { - "bl": "^4.0.3", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "log-symbols": "^4.0.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "confbox": "^0.2.2", + "exsolve": "^1.0.7", + "pathe": "^2.0.3" } }, - "node_modules/nx/node_modules/tmp": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", - "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", "dev": true, + "license": "MIT", "engines": { - "node": ">=14.14" + "node": ">= 0.4" } }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, "engines": { - "node": "*" + "node": "^10 || ^12 || >=14" } }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "engines": { - "node": ">= 0.4" - }, + "node_modules/preact": { + "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": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/preact" } }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">= 0.8.0" } }, - "node_modules/object.assign": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", - "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0", - "has-symbols": "^1.1.0", - "object-keys": "^1.1.1" + "node_modules/prettier": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", + "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" }, "engines": { - "node": ">= 0.4" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true - }, - "node_modules/ofetch": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.4.1.tgz", - "integrity": "sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==", + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", "dev": true, "license": "MIT", "dependencies": { - "destr": "^2.0.3", - "node-fetch-native": "^1.6.4", - "ufo": "^1.5.4" + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" } }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/on-headers": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", - "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", + "node_modules/pretty-bytes": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-6.1.1.tgz", + "integrity": "sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==", + "dev": true, "license": "MIT", "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" + "node": "^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/oniguruma-parser": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.1.tgz", - "integrity": "sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==", - "license": "MIT" - }, - "node_modules/oniguruma-to-es": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.3.tgz", - "integrity": "sha512-rPiZhzC3wXwE59YQMRDodUwwT9FZ9nNBwQQfsd1wfdtlKEyCdRV0avrTcSZ5xlIvGRVPd/cx6ZN45ECmS39xvg==", + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, "license": "MIT", "dependencies": { - "oniguruma-parser": "^0.12.1", - "regex": "^6.0.1", - "regex-recursion": "^6.0.2" + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "node_modules/proc-log": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", + "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", "dev": true, - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, + "license": "ISC", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, + "license": "MIT" + }, + "node_modules/proggy": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/proggy/-/proggy-2.0.0.tgz", + "integrity": "sha512-69agxLtnI8xBs9gUGqEnK26UfiexpHy+KUpBQWabiytQjnn5wFY8rklAi7GRfABIuPNnQ/ik48+LGLkYYJcy4A==", + "dev": true, + "license": "ISC", "engines": { - "node": ">= 0.8.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, + "node_modules/promise-all-reject-late": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz", + "integrity": "sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==", + "dev": true, + "license": "ISC", "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/ora/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, + "node_modules/promise-call-limit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/promise-call-limit/-/promise-call-limit-3.0.2.tgz", + "integrity": "sha512-mRPQO2T1QQVw11E7+UdCJu7S61eJVWknzml9sC1heAdj1jxl0fWMBypIt9ZOcLFf8FkG995ZD7RnVk7HH72fZw==", + "dev": true, + "license": "ISC", "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/ora/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "err-code": "^2.0.2", + "retry": "^0.12.0" }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/os-tmpdir": { + "node_modules/promzard": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "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", - "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "resolved": "https://registry.npmjs.org/promzard/-/promzard-1.0.2.tgz", + "integrity": "sha512-2FPputGL+mP3jJ3UZg/Dl9YOkovB7DX0oOr+ck5QbZ5MtORtds8k/BZdn+02peDLI8/YWbmzx34k5fA+fHvCVQ==", "dev": true, + "license": "ISC", "dependencies": { - "get-intrinsic": "^1.2.6", - "object-keys": "^1.1.1", - "safe-push-apply": "^1.0.0" + "read": "^3.0.1" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/p-cancelable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", - "dev": true, - "engines": { - "node": ">=12.20" + "node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "node_modules/protocols": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.2.tgz", + "integrity": "sha512-hHVTzba3wboROl0/aWRRG9dMytgH6ow//STBZh43l/wQgmMhYhOFi0EHWAPtoCz9IAUymsyP0TSBHkhgMEGNnQ==", "dev": true, - "engines": { - "node": ">=4" - } + "license": "MIT" }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "dev": true, + "license": "MIT", "dependencies": { - "yocto-queue": "^0.1.0" + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.10" } }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true, + "license": "MIT" + }, + "node_modules/pump": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", + "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", "dev": true, + "license": "MIT", "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, + "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, - "node_modules/p-map-series": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map-series/-/p-map-series-2.1.0.tgz", - "integrity": "sha512-RpYIIK1zXSNEOdwxcfe7FdvGcs7+y5n8rifMhMNWvaxRNMPINJHF5GDeuVxWqnfrcHPSCnp7Oo5yNXHId9Av2Q==", + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/p-pipe": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-pipe/-/p-pipe-3.1.0.tgz", - "integrity": "sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw==", - "dev": true, + "node_modules/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, "engines": { - "node": ">=8" + "node": ">=0.6" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/p-queue": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", - "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "node_modules/quansync": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz", + "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, + "node_modules/query-string": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-9.3.1.tgz", + "integrity": "sha512-5fBfMOcDi5SA9qj5jZhWAcTtDfKF5WFdd2uD9nVNlbxVv1baq65aALy6qofpNEGELHvisjjasxQp7BlM9gvMzw==", + "license": "MIT", "dependencies": { - "eventemitter3": "^4.0.4", - "p-timeout": "^3.2.0" + "decode-uri-component": "^0.4.1", + "filter-obj": "^5.1.0", + "split-on-first": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-reduce": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-2.1.0.tgz", - "integrity": "sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==", + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/p-timeout": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, + "license": "MIT", "dependencies": { - "p-finally": "^1.0.0" - }, - "engines": { - "node": ">=8" + "safe-buffer": "^5.1.0" } }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "dev": true, + "license": "MIT", "engines": { - "node": ">=6" + "node": ">= 0.6" } }, - "node_modules/p-waterfall": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-waterfall/-/p-waterfall-2.1.1.tgz", - "integrity": "sha512-RRTnDb2TBG/epPRI2yYXsimO0v3BXC8Yd3ogr1545IaqKK17VGhbWVeGGN+XfCm/08OK8635nH31c8bATkHuSw==", + "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": { - "p-reduce": "^2.0.0" + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.8" } }, - "node_modules/package-json": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.1.tgz", - "integrity": "sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==", + "node_modules/raw-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==", "dev": true, + "license": "MIT", "dependencies": { - "got": "^12.1.0", - "registry-auth-token": "^5.0.1", - "registry-url": "^6.0.0", - "semver": "^7.3.7" + "safer-buffer": ">= 2.1.2 < 3" }, "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true - }, - "node_modules/package-manager-detector": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.3.0.tgz", - "integrity": "sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==", + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true, "license": "MIT" }, - "node_modules/pacote": { - "version": "18.0.6", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-18.0.6.tgz", - "integrity": "sha512-+eK3G27SMwsB8kLIuj4h1FUhHtwiEUo21Tw8wNjmvdlpOEr613edv+8FUsTj/4F/VN5ywGE19X18N7CC2EJk6A==", + "node_modules/read": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/read/-/read-3.0.1.tgz", + "integrity": "sha512-SLBrDU/Srs/9EoWhU5GdbAoxG1GzpQHo/6qiGItaoLJ1thmYpcNIM1qISEUvyHBzfGlWIyd6p2DNi1oV1VmAuw==", "dev": true, + "license": "ISC", "dependencies": { - "@npmcli/git": "^5.0.0", - "@npmcli/installed-package-contents": "^2.0.1", - "@npmcli/package-json": "^5.1.0", - "@npmcli/promise-spawn": "^7.0.0", - "@npmcli/run-script": "^8.0.0", - "cacache": "^18.0.0", - "fs-minipass": "^3.0.0", - "minipass": "^7.0.2", - "npm-package-arg": "^11.0.0", - "npm-packlist": "^8.0.0", - "npm-pick-manifest": "^9.0.0", - "npm-registry-fetch": "^17.0.0", - "proc-log": "^4.0.0", - "promise-retry": "^2.0.1", - "sigstore": "^2.2.0", - "ssri": "^10.0.0", - "tar": "^6.1.11" - }, - "bin": { - "pacote": "bin/index.js" + "mute-stream": "^1.0.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "node_modules/read-cmd-shim": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-4.0.0.tgz", + "integrity": "sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q==", "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, + "license": "ISC", "engines": { - "node": ">=6" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/parse-conflict-json": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/parse-conflict-json/-/parse-conflict-json-3.0.1.tgz", - "integrity": "sha512-01TvEktc68vwbJOtWZluyWeVGWjP+bZwXtPDMQVbBKzbJ/vZBif0L69KH1+cHv1SZ6e0FKLvjyHe8mqsIqYOmw==", + "node_modules/read-package-json-fast": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", + "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", "dev": true, + "license": "ISC", "dependencies": { "json-parse-even-better-errors": "^3.0.0", - "just-diff": "^6.0.0", - "just-diff-apply": "^5.2.0" + "npm-normalize-package-bin": "^3.0.0" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/parse-github-url": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/parse-github-url/-/parse-github-url-1.0.3.tgz", - "integrity": "sha512-tfalY5/4SqGaV/GIGzWyHnFjlpTPTNpENR9Ea2lLldSJ8EWXMsvacWucqY3m3I4YPtas15IxTLQVQ5NSYXPrww==", + "node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", "dev": true, - "bin": { - "parse-github-url": "cli.js" + "license": "MIT", + "dependencies": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" }, "engines": { - "node": ">= 0.10" + "node": ">=4" } }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "node_modules/read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, - "node_modules/parse-json/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/parse-json/node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/parse-path": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.1.0.tgz", - "integrity": "sha512-EuCycjZtfPcjWk7KTksnJ5xPMvWGA/6i4zrLYhRG0hGvC3GPU/jGUj3Cy+ZR0v30duV3e23R95T1lE2+lsndSw==", + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", "dev": true, + "license": "MIT", "dependencies": { - "protocols": "^2.0.0" + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/parse-url": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-8.1.0.tgz", - "integrity": "sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==", + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", "dev": true, + "license": "MIT", "dependencies": { - "parse-path": "^7.0.0" + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^1.0.0" + }, "engines": { - "node": ">= 0.8" + "node": ">=4" } }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^1.1.0" + }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "node_modules/read-pkg-up/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "node_modules/read-pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "node_modules/read-pkg/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true, + "license": "ISC" }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "node_modules/read-pkg/node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", "dev": true, + "license": "MIT", "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" }, "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=4" } }, - "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==" - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, - "engines": { - "node": ">=8" + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, - "node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "dev": true - }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "dev": true - }, - "node_modules/perfect-debounce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", - "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", - "dev": true - }, - "node_modules/pg": { - "version": "8.16.3", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.16.3.tgz", - "integrity": "sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==", + "node_modules/read-pkg/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", "dev": true, "license": "MIT", "dependencies": { - "pg-connection-string": "^2.9.1", - "pg-pool": "^3.10.1", - "pg-protocol": "^1.10.3", - "pg-types": "2.2.0", - "pgpass": "1.0.5" + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" }, "engines": { - "node": ">= 16.0.0" - }, - "optionalDependencies": { - "pg-cloudflare": "^1.2.7" - }, - "peerDependencies": { - "pg-native": ">=3.0.1" - }, - "peerDependenciesMeta": { - "pg-native": { - "optional": true - } + "node": ">=4" } }, - "node_modules/pg-cloudflare": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.2.7.tgz", - "integrity": "sha512-YgCtzMH0ptvZJslLM1ffsY4EuGaU0cx4XSdXLRFae8bPP4dS5xL1tNB3k2o/N64cHJpwU7dxKli/nZ2lUa5fLg==", + "node_modules/read-pkg/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", "dev": true, "license": "MIT", - "optional": true - }, - "node_modules/pg-connection-string": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.2.tgz", - "integrity": "sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==", - "dev": true - }, - "node_modules/pg-int8": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", - "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", - "dev": true, "engines": { - "node": ">=4.0.0" + "node": ">=4" } }, - "node_modules/pg-pool": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.10.1.tgz", - "integrity": "sha512-Tu8jMlcX+9d8+QVzKIvM/uJtp07PKr82IUOYEphaWcoBhIYkoHpLXN3qO59nAI11ripznDsEzEv8nUxBVWajGg==", + "node_modules/read-pkg/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, - "license": "MIT", - "peerDependencies": { - "pg": ">=8.0" + "license": "ISC", + "bin": { + "semver": "bin/semver" } }, - "node_modules/pg-protocol": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.10.3.tgz", - "integrity": "sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/pg-types": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", - "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "node_modules/read-pkg/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, - "dependencies": { - "pg-int8": "1.0.1", - "postgres-array": "~2.0.0", - "postgres-bytea": "~1.0.0", - "postgres-date": "~1.0.4", - "postgres-interval": "^1.1.0" - }, + "license": "MIT", "engines": { "node": ">=4" } }, - "node_modules/pg/node_modules/pg-connection-string": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.9.1.tgz", - "integrity": "sha512-nkc6NpDcvPVpZXxrreI/FOtX3XemeLl8E0qFr6F2Lrm/I8WOnaWNhIPK2Z7OHpw7gh5XJThi6j6ppgNoaT1w4w==", - "dev": true, - "license": "MIT" - }, - "node_modules/pgpass": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", - "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", - "dev": true, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", "dependencies": { - "split2": "^4.1.0" - } - }, - "node_modules/pgpass/node_modules/split2": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", - "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", - "dev": true, + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, "engines": { - "node": ">= 10.x" + "node": ">= 6" } }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8.6" + "node": ">= 14.18.0" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, - "node_modules/pify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", - "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", "dev": true, - "engines": { - "node": ">=10" + "dependencies": { + "resolve": "^1.1.6" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">= 0.10" } }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", "dev": true, + "license": "MIT", "dependencies": { - "find-up": "^4.0.0" + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", "dev": true, + "license": "MIT", "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } + "license": "MIT" }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/regenerate-unicode-properties": { + "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": { - "p-try": "^2.0.0" + "regenerate": "^1.4.2" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, + "node_modules/regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/regex/-/regex-6.0.1.tgz", + "integrity": "sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==", + "license": "MIT", "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" + "regex-utilities": "^2.3.0" } }, - "node_modules/pkg-types": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.1.0.tgz", - "integrity": "sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A==", - "dev": true, + "node_modules/regex-recursion": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", + "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", + "license": "MIT", "dependencies": { - "confbox": "^0.2.1", - "exsolve": "^1.0.1", - "pathe": "^2.0.3" + "regex-utilities": "^2.3.0" } }, - "node_modules/possible-typed-array-names": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", - "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", - "dev": true, - "engines": { - "node": ">= 0.4" - } + "node_modules/regex-utilities": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", + "license": "MIT" }, - "node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, "license": "MIT", "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" }, "engines": { - "node": "^10 || ^12 || >=14" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "node_modules/regexpu-core": { + "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": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.2", + "regjsgen": "^0.8.0", + "regjsparser": "^0.13.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.2.1" }, "engines": { "node": ">=4" } }, - "node_modules/postgres-array": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", - "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", "dev": true, - "engines": { - "node": ">=4" + "license": "MIT" + }, + "node_modules/regjsparser": { + "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.1.0" + }, + "bin": { + "regjsparser": "bin/parser" } }, - "node_modules/postgres-bytea": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", - "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/postgres-date": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", - "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/postgres-interval": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", - "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", "dev": true, + "license": "MIT", "dependencies": { - "xtend": "^4.0.0" + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/preact": { - "version": "10.26.5", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.26.5.tgz", - "integrity": "sha512-fmpDkgfGU6JYux9teDWLhj9mKN55tyepwYbxHgQuIxbWQzgFg5vk7Mrrtfx7xRxq798ynkY4DDDxZr235Kk+4w==", - "dev": true, + "node": ">= 0.4" + }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/preact" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/prebuild-install": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", - "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, + "license": "MIT", "dependencies": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^2.0.0", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "bin": { - "prebuild-install": "bin.js" + "resolve-from": "^5.0.0" }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "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==", + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.8.0" + "node": ">=4" } }, - "node_modules/prettier": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", - "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "node_modules/resolve.exports": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", + "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", "dev": true, - "dependencies": { - "fast-diff": "^1.1.2" - }, + "license": "MIT", "engines": { - "node": ">=6.0.0" + "node": ">=10" } }, - "node_modules/pretty-bytes": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-6.1.1.tgz", - "integrity": "sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==", - "dev": true, - "engines": { - "node": "^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "license": "MIT", "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=8" } }, - "node_modules/proc-log": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", - "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", "dev": true, + "license": "MIT", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">= 4" } }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.6.0" + "iojs": ">=1.0.0", + "node": ">=0.10.0" } }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "node_modules/proggy": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/proggy/-/proggy-2.0.0.tgz", - "integrity": "sha512-69agxLtnI8xBs9gUGqEnK26UfiexpHy+KUpBQWabiytQjnn5wFY8rklAi7GRfABIuPNnQ/ik48+LGLkYYJcy4A==", + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } + "license": "MIT" }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "node_modules/rimraf": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz", + "integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==", "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^9.2.0" + }, + "bin": { + "rimraf": "dist/cjs/src/bin.js" + }, "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/promise-all-reject-late": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz", - "integrity": "sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/promise-call-limit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/promise-call-limit/-/promise-call-limit-3.0.2.tgz", - "integrity": "sha512-mRPQO2T1QQVw11E7+UdCJu7S61eJVWknzml9sC1heAdj1jxl0fWMBypIt9ZOcLFf8FkG995ZD7RnVk7HH72fZw==", - "dev": true, + "node": ">=14" + }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "dev": true - }, - "node_modules/promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "node_modules/rimraf/node_modules/glob": { + "version": "9.3.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", + "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", "dev": true, + "license": "ISC", "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" + "fs.realpath": "^1.0.0", + "minimatch": "^8.0.2", + "minipass": "^4.2.4", + "path-scurry": "^1.6.1" }, "engines": { - "node": ">=10" - } - }, - "node_modules/prompts-ncu": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/prompts-ncu/-/prompts-ncu-3.0.2.tgz", - "integrity": "sha512-BthHeqP0vwvZPk3ZmqZXhssNabxM60aBCbg/gQdxF8bQW/dy6ZGQpS8SG10bUQTMy5HKh34iI0g0TstCRZyjag==", - "dev": true, - "dependencies": { - "kleur": "^4.0.1", - "sisteransi": "^1.0.5" + "node": ">=16 || 14 >=14.17" }, - "engines": { - "node": ">= 14" + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/promzard": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/promzard/-/promzard-1.0.2.tgz", - "integrity": "sha512-2FPputGL+mP3jJ3UZg/Dl9YOkovB7DX0oOr+ck5QbZ5MtORtds8k/BZdn+02peDLI8/YWbmzx34k5fA+fHvCVQ==", + "node_modules/rimraf/node_modules/minimatch": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", + "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", "dev": true, + "license": "ISC", "dependencies": { - "read": "^3.0.1" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/property-information": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.0.0.tgz", - "integrity": "sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", - "dev": true - }, - "node_modules/protocols": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.2.tgz", - "integrity": "sha512-hHVTzba3wboROl0/aWRRG9dMytgH6ow//STBZh43l/wQgmMhYhOFi0EHWAPtoCz9IAUymsyP0TSBHkhgMEGNnQ==", - "dev": true - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" + "node": ">=16 || 14 >=14.17" }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, - "node_modules/pump": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", - "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "engines": { - "node": ">=6" + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/punycode.js": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", - "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "node_modules/rimraf/node_modules/minipass": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", + "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", "dev": true, + "license": "ISC", "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/pupa": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.1.0.tgz", - "integrity": "sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==", + "node_modules/rollup": { + "version": "4.52.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.4.tgz", + "integrity": "sha512-CLEVl+MnPAiKh5pl4dEWSyMTpuflgNQiLGhMv8ezD5W/qP8AKvmYpCOKRRNOh7oRKnauBZ4SyeYkMS+1VSyKwQ==", "dev": true, + "license": "MIT", "dependencies": { - "escape-goat": "^4.0.0" - }, - "engines": { - "node": ">=12.20" + "@types/estree": "1.0.8" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", - "dependencies": { - "side-channel": "^1.1.0" + "bin": { + "rollup": "dist/bin/rollup" }, "engines": { - "node": ">=0.6" + "node": ">=18.0.0", + "npm": ">=8.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.52.4", + "@rollup/rollup-android-arm64": "4.52.4", + "@rollup/rollup-darwin-arm64": "4.52.4", + "@rollup/rollup-darwin-x64": "4.52.4", + "@rollup/rollup-freebsd-arm64": "4.52.4", + "@rollup/rollup-freebsd-x64": "4.52.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.52.4", + "@rollup/rollup-linux-arm-musleabihf": "4.52.4", + "@rollup/rollup-linux-arm64-gnu": "4.52.4", + "@rollup/rollup-linux-arm64-musl": "4.52.4", + "@rollup/rollup-linux-loong64-gnu": "4.52.4", + "@rollup/rollup-linux-ppc64-gnu": "4.52.4", + "@rollup/rollup-linux-riscv64-gnu": "4.52.4", + "@rollup/rollup-linux-riscv64-musl": "4.52.4", + "@rollup/rollup-linux-s390x-gnu": "4.52.4", + "@rollup/rollup-linux-x64-gnu": "4.52.4", + "@rollup/rollup-linux-x64-musl": "4.52.4", + "@rollup/rollup-openharmony-arm64": "4.52.4", + "@rollup/rollup-win32-arm64-msvc": "4.52.4", + "@rollup/rollup-win32-ia32-msvc": "4.52.4", + "@rollup/rollup-win32-x64-gnu": "4.52.4", + "@rollup/rollup-win32-x64-msvc": "4.52.4", + "fsevents": "~2.3.2" } }, - "node_modules/quansync": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.10.tgz", - "integrity": "sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/antfu" - }, - { - "type": "individual", - "url": "https://github.com/sponsors/sxzz" - } - ] - }, - "node_modules/query-string": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-9.2.2.tgz", - "integrity": "sha512-pDSIZJ9sFuOp6VnD+5IkakSVf+rICAuuU88Hcsr6AKL0QtxSIfVuKiVP2oahFI7tk3CRSexwV+Ya6MOoTxzg9g==", + "node_modules/run-async": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", + "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", "license": "MIT", - "dependencies": { - "decode-uri-component": "^0.4.1", - "filter-obj": "^5.1.0", - "split-on-first": "^3.0.0" - }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.12.0" } }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, "funding": [ { @@ -18606,420 +16027,547 @@ "type": "consulting", "url": "https://feross.org/support" } - ] - }, - "node_modules/quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, + ], + "license": "MIT", "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "engines": { - "node": ">= 0.6" + "queue-microtask": "^1.2.2" } }, - "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==", + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "license": "Apache-2.0", "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" + "tslib": "^2.1.0" } }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", "dev": true, + "license": "MIT", "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc-config-loader": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/rc-config-loader/-/rc-config-loader-4.1.3.tgz", - "integrity": "sha512-kD7FqML7l800i6pS6pvLyIE2ncbk9Du8Q0gp/4hMPhJU6ZxApkoLcGD8ZeqgiAlfwZ6BlETq6qqe+12DUL207w==", - "dev": true, - "dependencies": { - "debug": "^4.3.4", - "js-yaml": "^4.1.0", - "json5": "^2.2.2", - "require-from-string": "^2.0.2" + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "dev": true, - "engines": { - "node": ">=0.10.0" - } + "license": "MIT" }, - "node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" }, - "node_modules/read": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/read/-/read-3.0.1.tgz", - "integrity": "sha512-SLBrDU/Srs/9EoWhU5GdbAoxG1GzpQHo/6qiGItaoLJ1thmYpcNIM1qISEUvyHBzfGlWIyd6p2DNi1oV1VmAuw==", + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", "dev": true, + "license": "MIT", "dependencies": { - "mute-stream": "^1.0.0" + "es-errors": "^1.3.0", + "isarray": "^2.0.5" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/read-cmd-shim": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-4.0.0.tgz", - "integrity": "sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q==", + "node_modules/safe-push-apply/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } + "license": "MIT" }, - "node_modules/read-package-json": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.4.tgz", - "integrity": "sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==", - "deprecated": "This package is no longer supported. Please use @npmcli/package-json instead.", + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", "dev": true, + "license": "MIT", "dependencies": { - "glob": "^10.2.2", - "json-parse-even-better-errors": "^3.0.0", - "normalize-package-data": "^5.0.0", - "npm-normalize-package-bin": "^3.0.0" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/read-package-json-fast": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", - "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/sass": { + "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": { - "json-parse-even-better-errors": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" + "chokidar": "^4.0.0", + "immutable": "^5.0.2", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" } }, - "node_modules/read-package-json/node_modules/hosted-git-info": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.3.tgz", - "integrity": "sha512-HVJyzUrLIL1c0QmviVh5E8VGyUS7xCFPS6yydaVd1UegW+ibV/CohqTH9MkOLDp5o+rb82DMo77PTuc9F/8GKw==", + "node_modules/sax": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", "dev": true, - "dependencies": { - "lru-cache": "^7.5.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } + "license": "ISC" }, - "node_modules/read-package-json/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "node_modules/scule": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/scule/-/scule-1.3.0.tgz", + "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==", "dev": true, - "engines": { - "node": ">=12" - } + "license": "MIT" }, - "node_modules/read-package-json/node_modules/normalize-package-data": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", - "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", + "node_modules/search-insights": { + "version": "2.17.3", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz", + "integrity": "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==", "dev": true, - "dependencies": { - "hosted-git-info": "^6.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" + "license": "MIT", + "peer": true + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "dev": true, + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=10" } }, - "node_modules/read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", + "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": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" + "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": ">=4" + "node": ">= 0.8.0" } }, - "node_modules/read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==", + "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==", "dev": true, + "license": "MIT", "dependencies": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" - }, - "engines": { - "node": ">=4" + "ms": "2.0.0" } }, - "node_modules/read-pkg-up/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "locate-path": "^2.0.0" + "randombytes": "^2.1.0" + } + }, + "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": ">=4" + "node": ">= 0.8.0" } }, - "node_modules/read-pkg-up/node_modules/locate-path": { + "node_modules/set-blocking": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true, + "license": "ISC" + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dev": true, + "license": "MIT", "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" }, "engines": { - "node": ">=4" + "node": ">= 0.4" } }, - "node_modules/read-pkg-up/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, + "license": "MIT", "dependencies": { - "p-try": "^1.0.0" + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" }, "engines": { - "node": ">=4" + "node": ">= 0.4" } }, - "node_modules/read-pkg-up/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", "dev": true, + "license": "MIT", "dependencies": { - "p-limit": "^1.1.0" + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" }, "engines": { - "node": ">=4" + "node": ">= 0.4" } }, - "node_modules/read-pkg-up/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true, + "license": "ISC" + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.2" + }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/read-pkg-up/node_modules/path-exists": { + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/read-pkg/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true + "node_modules/shelljs": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.9.2.tgz", + "integrity": "sha512-S3I64fEiKgTZzKCC46zT/Ib9meqofLrQVbpSswtjFfAVDW+AZ54WTnAM/3/yENoxz/V1Cy6u3kiiEbQ4DNphvw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "execa": "^1.0.0", + "fast-glob": "^3.3.2", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=18" + } }, - "node_modules/read-pkg/node_modules/load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "node_modules/shelljs/node_modules/cross-spawn": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", "dev": true, + "license": "MIT", "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" }, "engines": { - "node": ">=4" + "node": ">=4.8" } }, - "node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "node_modules/shelljs/node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "dev": true, + "license": "MIT", "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" } }, - "node_modules/read-pkg/node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "node_modules/shelljs/node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "dev": true, + "license": "MIT", "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "pump": "^3.0.0" }, "engines": { - "node": ">=4" + "node": ">=6" } }, - "node_modules/read-pkg/node_modules/path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "node_modules/shelljs/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shelljs/node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "dev": true, + "license": "MIT", "dependencies": { - "pify": "^3.0.0" + "path-key": "^2.0.0" }, "engines": { "node": ">=4" } }, - "node_modules/read-pkg/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "node_modules/shelljs/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, - "node_modules/read-pkg/node_modules/semver": { + "node_modules/shelljs/node_modules/semver": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver" } }, - "node_modules/read-pkg/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "node_modules/shelljs/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "license": "MIT", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "shebang-regex": "^1.0.0" }, "engines": { - "node": ">= 6" + "node": ">=0.10.0" } }, - "node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "node_modules/shelljs/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 14.18.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" + "node": ">=0.10.0" } }, - "node_modules/rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "node_modules/shelljs/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, + "license": "ISC", "dependencies": { - "resolve": "^1.1.6" + "isexe": "^2.0.0" }, - "engines": { - "node": ">= 0.10" + "bin": { + "which": "bin/which" } }, - "node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "node_modules/shiki": { + "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.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" + } + }, + "node_modules/shx": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/shx/-/shx-0.4.0.tgz", + "integrity": "sha512-Z0KixSIlGPpijKgcH6oCMCbltPImvaKy0sGH8AkLRXw1KyzpKtaCTizP2xen+hNDqVF4xxgvA0KXSb9o4Q6hnA==", "dev": true, + "license": "MIT", "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" + "minimist": "^1.2.8", + "shelljs": "^0.9.2" + }, + "bin": { + "shx": "lib/cli.js" }, "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", - "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", - "dev": true, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.7", - "get-proto": "^1.0.1", - "which-builtin-type": "^1.2.1" + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -19028,57 +16576,32 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "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==", - "dev": true, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", "dependencies": { - "regenerate": "^1.4.2" + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" }, "engines": { - "node": ">=4" - } - }, - "node_modules/regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/regex/-/regex-6.0.1.tgz", - "integrity": "sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==", - "dependencies": { - "regex-utilities": "^2.3.0" - } - }, - "node_modules/regex-recursion": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", - "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", - "dependencies": { - "regex-utilities": "^2.3.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/regex-utilities": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", - "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==" - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", - "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", - "dev": true, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", + "call-bound": "^1.0.2", "es-errors": "^1.3.0", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "set-function-name": "^2.0.2" + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" }, "engines": { "node": ">= 0.4" @@ -19087,1565 +16610,1475 @@ "url": "https://github.com/sponsors/ljharb" } }, - "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==", - "dev": true, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", "dependencies": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.2.0", - "regjsgen": "^0.8.0", - "regjsparser": "^0.12.0", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" }, "engines": { - "node": ">=4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/registry-auth-token": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.1.0.tgz", - "integrity": "sha512-GdekYuwLXLxMuFTwAPg5UKGLW/UXzQrZvH/Zj791BQif5T05T0RsaLfHc9q3ZOKi7n+BoprPD9mJ0O0k4xzUlw==", + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, + "node_modules/sigstore": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-2.3.1.tgz", + "integrity": "sha512-8G+/XDU8wNsJOQS5ysDVO0Etg9/2uA5gR9l4ZwijjlwxBcrU6RPfwi2+jJmbP+Ap1Hlp/nVAaEO4Fj22/SL2gQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@pnpm/npm-conf": "^2.1.0" + "@sigstore/bundle": "^2.3.2", + "@sigstore/core": "^1.0.0", + "@sigstore/protobuf-specs": "^0.3.2", + "@sigstore/sign": "^2.3.2", + "@sigstore/tuf": "^2.3.4", + "@sigstore/verify": "^1.2.1" }, "engines": { - "node": ">=14" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/registry-url": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", - "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", + "node_modules/sirv": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz", + "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==", "dev": true, + "license": "MIT", "dependencies": { - "rc": "1.2.8" + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=18" } }, - "node_modules/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", - "dev": true - }, - "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==", + "node_modules/sitemap": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-8.0.0.tgz", + "integrity": "sha512-+AbdxhM9kJsHtruUF39bwS/B0Fytw6Fr1o4ZAIAEqA6cke2xcoO2GleBw9Zw7nRzILVEgz7zBM5GiTJjie1G9A==", "dev": true, + "license": "MIT", "dependencies": { - "jsesc": "~3.0.2" + "@types/node": "^17.0.5", + "@types/sax": "^1.2.1", + "arg": "^5.0.0", + "sax": "^1.2.4" }, "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, - "bin": { - "jsesc": "bin/jsesc" + "sitemap": "dist/cli.js" }, "engines": { - "node": ">=6" + "node": ">=14.0.0", + "npm": ">=6.0.0" } }, - "node_modules/remote-git-tags": { + "node_modules/sitemap/node_modules/@types/node": { + "version": "17.0.45", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", + "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==", + "dev": true, + "license": "MIT" + }, + "node_modules/slash": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/remote-git-tags/-/remote-git-tags-3.0.0.tgz", - "integrity": "sha512-C9hAO4eoEsX+OXA4rla66pXZQ+TLQ8T9dttgQj18yuKlPMTVkIkdYXvlMC55IuUsIkV6DpmQYi10JKFLaU+l7w==", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/request-compose": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/request-compose/-/request-compose-2.1.7.tgz", - "integrity": "sha512-27amNkWTK4Qq25XEwdmrhb4VLMiQzRSKuDfsy1o1griykcyXk5MxMHmJG+OKTRdO9PgsO7Kkn7GrEkq0UAIIMQ==", + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=12.0.0" + "node": ">= 6.0.0", + "npm": ">= 3.0.0" } }, - "node_modules/request-oauth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/request-oauth/-/request-oauth-1.0.1.tgz", - "integrity": "sha512-85THTg1RgOYtqQw42JON6AqvHLptlj1biw265Tsq4fD4cPdUvhDB2Qh9NTv17yCD322ROuO9aOmpc4GyayGVBA==", + "node_modules/smob": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/smob/-/smob-1.5.0.tgz", + "integrity": "sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==", + "dev": true, + "license": "MIT" + }, + "node_modules/socks": { + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", + "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", + "dev": true, + "license": "MIT", "dependencies": { - "oauth-sign": "^0.9.0", - "qs": "^6.9.6", - "uuid": "^8.3.2" + "ip-address": "^10.0.1", + "smart-buffer": "^4.2.0" }, "engines": { - "node": ">=8.0.0" + "node": ">= 10.0.0", + "npm": ">= 3.0.0" } }, - "node_modules/request-oauth/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" + "node_modules/socks-proxy-agent": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" } }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "node_modules/sort-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", + "integrity": "sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-obj": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, - "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, + "license": "MIT", "dependencies": { - "is-core-module": "^2.16.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead", + "dev": true, + "license": "MIT" + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "dev": true + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true, + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, + "license": "MIT", "dependencies": { - "resolve-from": "^5.0.0" + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.22", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz", + "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">=6.0.0" } }, - "node_modules/resolve-cwd/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", "dev": true, - "engines": { - "node": ">=8" + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" } }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "node_modules/speakingurl": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", + "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", "dev": true, + "license": "BSD-3-Clause", "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/resolve-path": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/resolve-path/-/resolve-path-1.4.0.tgz", - "integrity": "sha512-i1xevIst/Qa+nA9olDxLWnLk8YZbi8R/7JPbCMcgyWaFR6bKWaexgJgEB5oc2PKMjYdrHynyz0NY+if+H98t1w==", + "node_modules/split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "dev": true, + "license": "MIT", "dependencies": { - "http-errors": "~1.6.2", - "path-is-absolute": "1.0.1" + "through": "2" }, "engines": { - "node": ">= 0.8" + "node": "*" } }, - "node_modules/resolve-path/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "node_modules/split-on-first": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-3.0.0.tgz", + "integrity": "sha512-qxQJTx2ryR0Dw0ITYyekNQWpz6f8dGd7vffGNflQQ3Iqj9NJ6qiZ7ELpZsJ/QBhIVAiDfXdag3+Gp8RvWa62AA==", + "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/resolve-path/node_modules/http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "node_modules/split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "dev": true, + "license": "ISC", "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, - "engines": { - "node": ">= 0.6" + "readable-stream": "^3.0.0" } }, - "node_modules/resolve-path/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" - }, - "node_modules/resolve-path/node_modules/setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" }, - "node_modules/resolve-path/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "node_modules/ssri": { + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz", + "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, "engines": { - "node": ">= 0.6" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" }, - "node_modules/resolve.exports": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", - "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", + "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": ">=10" + "node": ">= 0.8" } }, - "node_modules/responselike": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", - "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", + "node_modules/std-env": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz", + "integrity": "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==", + "dev": true, + "license": "MIT" + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", "dev": true, + "license": "MIT", "dependencies": { - "lowercase-keys": "^3.0.0" + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" }, "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.4" } }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" + "safe-buffer": "~5.2.0" } }, - "node_modules/restore-cursor/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "dev": true, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, "engines": { - "node": ">= 4" + "node": ">=8" } }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/rfdc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", - "dev": true - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", "dev": true, + "license": "MIT", "dependencies": { - "glob": "^7.1.3" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" }, - "bin": { - "rimraf": "bin.js" + "engines": { + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", "dev": true, + "license": "MIT", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" }, "engines": { - "node": "*" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/rimraf/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", "dev": true, + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { - "node": "*" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/rollup": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.40.1.tgz", - "integrity": "sha512-C5VvvgCCyfyotVITIAv+4efVytl5F7wt+/I2i9q9GZcEXW9BP52YYOXC58igUi+LFZVHukErIIqQSWwv/M3WRw==", + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, + "license": "MIT", "dependencies": { - "@types/estree": "1.0.7" - }, - "bin": { - "rollup": "dist/bin/rollup" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" + "node": ">= 0.4" }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.40.1", - "@rollup/rollup-android-arm64": "4.40.1", - "@rollup/rollup-darwin-arm64": "4.40.1", - "@rollup/rollup-darwin-x64": "4.40.1", - "@rollup/rollup-freebsd-arm64": "4.40.1", - "@rollup/rollup-freebsd-x64": "4.40.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.40.1", - "@rollup/rollup-linux-arm-musleabihf": "4.40.1", - "@rollup/rollup-linux-arm64-gnu": "4.40.1", - "@rollup/rollup-linux-arm64-musl": "4.40.1", - "@rollup/rollup-linux-loongarch64-gnu": "4.40.1", - "@rollup/rollup-linux-powerpc64le-gnu": "4.40.1", - "@rollup/rollup-linux-riscv64-gnu": "4.40.1", - "@rollup/rollup-linux-riscv64-musl": "4.40.1", - "@rollup/rollup-linux-s390x-gnu": "4.40.1", - "@rollup/rollup-linux-x64-gnu": "4.40.1", - "@rollup/rollup-linux-x64-musl": "4.40.1", - "@rollup/rollup-win32-arm64-msvc": "4.40.1", - "@rollup/rollup-win32-ia32-msvc": "4.40.1", - "@rollup/rollup-win32-x64-msvc": "4.40.1", - "fsevents": "~2.3.2" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/run-applescript": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", - "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", - "dev": true, - "engines": { - "node": ">=18" + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/run-async": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", - "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", + "node_modules/stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, "engines": { - "node": ">=0.12.0" + "node": ">=4" } }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "node_modules/stringify-object/node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/rxjs": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", - "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", "dependencies": { - "tslib": "^2.1.0" + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "node_modules/safe-array-concat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", - "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "has-symbols": "^1.1.0", - "isarray": "^2.0.5" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "node_modules/safe-array-concat/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "node_modules/strip-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", + "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } }, - "node_modules/safe-push-apply": { + "node_modules/strip-eof": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", - "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", "dev": true, - "dependencies": { - "es-errors": "^1.3.0", - "isarray": "^2.0.5" - }, + "license": "MIT", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.10.0" } }, - "node_modules/safe-push-apply/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "node_modules/safe-regex-test": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", - "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true, - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-regex": "^1.2.1" - }, + "license": "MIT", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=6" } }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/sass": { - "version": "1.89.2", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.89.2.tgz", - "integrity": "sha512-xCmtksBKd/jdJ9Bt9p7nPKiuqrlBMBuuGkQlkhZjjQk3Ty48lv93k5Dq6OPkKt4XwxDJ7tvlfrTa1MPA9bf+QA==", + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", "dev": true, "license": "MIT", "dependencies": { - "chokidar": "^4.0.0", - "immutable": "^5.0.2", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" + "min-indent": "^1.0.0" }, "engines": { - "node": ">=14.0.0" - }, - "optionalDependencies": { - "@parcel/watcher": "^2.4.1" + "node": ">=8" } }, - "node_modules/sax": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", - "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", - "dev": true - }, - "node_modules/schema-utils": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", - "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, + "license": "MIT", "engines": { - "node": ">= 10.13.0" + "node": ">=8" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/schema-utils/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "node_modules/strip-literal": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.1.0.tgz", + "integrity": "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==", "dev": true, + "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" + "js-tokens": "^9.0.1" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "url": "https://github.com/sponsors/antfu" } }, - "node_modules/schema-utils/node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "node_modules/superjson": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.2.tgz", + "integrity": "sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==", "dev": true, + "license": "MIT", "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" + "copy-anything": "^3.0.2" }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } + "engines": { + "node": ">=16" } }, - "node_modules/schema-utils/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.3" + "has-flag": "^4.0.0" }, - "peerDependencies": { - "ajv": "^8.8.2" + "engines": { + "node": ">=8" } }, - "node_modules/schema-utils/node_modules/json-schema-traverse": { + "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/scule": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/scule/-/scule-1.3.0.tgz", - "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==", - "dev": true - }, - "node_modules/search-insights": { - "version": "2.17.3", - "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz", - "integrity": "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, - "peer": true - }, - "node_modules/select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", - "dev": true - }, - "node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", - "bin": { - "semver": "bin/semver.js" - }, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/semver-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", - "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", + "node_modules/synckit": { + "version": "0.11.11", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.11.tgz", + "integrity": "sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==", "dev": true, + "license": "MIT", "dependencies": { - "semver": "^7.3.5" + "@pkgr/core": "^0.2.9" }, "engines": { - "node": ">=12" + "node": "^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/synckit" } }, - "node_modules/semver-utils": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/semver-utils/-/semver-utils-1.1.4.tgz", - "integrity": "sha512-EjnoLE5OGmDAVV/8YDoN5KiajNadjzIp9BAHOhYeQHt7j0UWxjmgsx4YD48wp4Ue1Qogq38F1GNUJNqF1kKKxA==", - "dev": true + "node_modules/tabbable": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", + "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", + "dev": true, + "license": "MIT" }, - "node_modules/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "dev": true, + "license": "ISC", "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" + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=10" } }, - "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/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "license": "MIT", "dependencies": { - "ms": "2.0.0" + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=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==" - }, - "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==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "node_modules/tar/node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", "dev": true, + "license": "ISC", "dependencies": { - "randombytes": "^2.1.0" - } - }, - "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==", - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" + "minipass": "^3.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 8" } }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, + "license": "ISC", "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" + "yallist": "^4.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=8" } }, - "node_modules/set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "dev": true, - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - }, + "license": "ISC", "engines": { - "node": ">= 0.4" + "node": ">=8" } }, - "node_modules/set-proto": { + "node_modules/temp-dir": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", - "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", + "integrity": "sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==", "dev": true, - "dependencies": { - "dunder-proto": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0" - }, + "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=4" } }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "node_modules/shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "node_modules/tempy": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz", + "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==", "dev": true, + "license": "MIT", "dependencies": { - "kind-of": "^6.0.2" + "is-stream": "^2.0.0", + "temp-dir": "^2.0.0", + "type-fest": "^0.16.0", + "unique-string": "^2.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/shebang-command": { + "node_modules/tempy/node_modules/temp-dir": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "node_modules/tempy/node_modules/type-fest": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", + "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/shelljs": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.9.2.tgz", - "integrity": "sha512-S3I64fEiKgTZzKCC46zT/Ib9meqofLrQVbpSswtjFfAVDW+AZ54WTnAM/3/yENoxz/V1Cy6u3kiiEbQ4DNphvw==", + "node_modules/terser": { + "version": "5.44.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.44.0.tgz", + "integrity": "sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "execa": "^1.0.0", - "fast-glob": "^3.3.2", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" }, "bin": { - "shjs": "bin/shjs" + "terser": "bin/terser" }, "engines": { - "node": ">=18" + "node": ">=10" } }, - "node_modules/shelljs/node_modules/cross-spawn": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", - "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true, - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } + "license": "MIT" }, - "node_modules/shelljs/node_modules/execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "node_modules/test-exclude": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz", + "integrity": "sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==", "dev": true, + "license": "ISC", "dependencies": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" + "@istanbuljs/schema": "^0.1.2", + "glob": "^10.4.1", + "minimatch": "^9.0.4" }, "engines": { - "node": ">=6" + "node": ">=18" } }, - "node_modules/shelljs/node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "node_modules/text-extensions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", + "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, + "license": "MIT", "engines": { - "node": ">=6" + "node": ">=0.10" } }, - "node_modules/shelljs/node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "dev": true, - "engines": { - "node": ">=0.10.0" - } + "license": "MIT" }, - "node_modules/shelljs/node_modules/npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dev": true, + "license": "MIT", "dependencies": { - "path-key": "^2.0.0" - }, - "engines": { - "node": ">=4" + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" } }, - "node_modules/shelljs/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "node_modules/through2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, - "engines": { - "node": ">=4" + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "node_modules/shelljs/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "node_modules/through2/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true, - "bin": { - "semver": "bin/semver" - } + "license": "MIT" }, - "node_modules/shelljs/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "node_modules/through2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, + "license": "MIT", "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" + "safe-buffer": "~5.1.0" } }, - "node_modules/shelljs/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/shelljs/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true + "license": "MIT" }, - "node_modules/shelljs/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } + "license": "MIT" }, - "node_modules/shiki": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-3.9.1.tgz", - "integrity": "sha512-HogZ8nMnv9VAQMrG+P7BleJFhrKHm3fi6CYyHRbUu61gJ0lpqLr6ecYEui31IYG1Cn9Bad7N2vf332iXHnn0bQ==", + "node_modules/tinyglobby": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.12.tgz", + "integrity": "sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==", + "dev": true, "license": "MIT", "dependencies": { - "@shikijs/core": "3.9.1", - "@shikijs/engine-javascript": "3.9.1", - "@shikijs/engine-oniguruma": "3.9.1", - "@shikijs/langs": "3.9.1", - "@shikijs/themes": "3.9.1", - "@shikijs/types": "3.9.1", - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4" + "fdir": "^6.4.3", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/shx": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/shx/-/shx-0.4.0.tgz", - "integrity": "sha512-Z0KixSIlGPpijKgcH6oCMCbltPImvaKy0sGH8AkLRXw1KyzpKtaCTizP2xen+hNDqVF4xxgvA0KXSb9o4Q6hnA==", + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, - "dependencies": { - "minimist": "^1.2.8", - "shelljs": "^0.9.2" + "license": "MIT", + "engines": { + "node": ">=12.0.0" }, - "bin": { - "shx": "lib/cli.js" + "peerDependencies": { + "picomatch": "^3 || ^4" }, - "engines": { - "node": ">=18" + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } } }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, + "node_modules/tinyglobby/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": ">= 0.4" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, + "node_modules/tinypool": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", + "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", + "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^18.0.0 || >=20.0.0" } }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, + "node_modules/tinyrainbow": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", + "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", + "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=14.0.0" } }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, + "node_modules/tinyspy": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.4.tgz", + "integrity": "sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==", + "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=14.0.0" } }, - "node_modules/sift": { - "version": "17.1.3", - "resolved": "https://registry.npmjs.org/sift/-/sift-17.1.3.tgz", - "integrity": "sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==" - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "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" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=14.14" } }, - "node_modules/sigstore": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-2.3.1.tgz", - "integrity": "sha512-8G+/XDU8wNsJOQS5ysDVO0Etg9/2uA5gR9l4ZwijjlwxBcrU6RPfwi2+jJmbP+Ap1Hlp/nVAaEO4Fj22/SL2gQ==", + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, + "license": "MIT", "dependencies": { - "@sigstore/bundle": "^2.3.2", - "@sigstore/core": "^1.0.0", - "@sigstore/protobuf-specs": "^0.3.2", - "@sigstore/sign": "^2.3.2", - "@sigstore/tuf": "^2.3.4", - "@sigstore/verify": "^1.2.1" + "is-number": "^7.0.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": ">=8.0" } }, - "node_modules/simple-concat": { + "node_modules/toidentifier": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" + "license": "MIT", + "engines": { + "node": ">=0.6" } }, - "node_modules/sirv": { + "node_modules/totalist": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.1.tgz", - "integrity": "sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", "dev": true, "license": "MIT", - "dependencies": { - "@polka/url": "^1.0.0-next.24", - "mrmime": "^2.0.0", - "totalist": "^3.0.0" - }, "engines": { - "node": ">=18" + "node": ">=6" } }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true, + "license": "MIT" }, - "node_modules/sitemap": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-8.0.0.tgz", - "integrity": "sha512-+AbdxhM9kJsHtruUF39bwS/B0Fytw6Fr1o4ZAIAEqA6cke2xcoO2GleBw9Zw7nRzILVEgz7zBM5GiTJjie1G9A==", + "node_modules/treeverse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/treeverse/-/treeverse-3.0.0.tgz", + "integrity": "sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ==", "dev": true, - "dependencies": { - "@types/node": "^17.0.5", - "@types/sax": "^1.2.1", - "arg": "^5.0.0", - "sax": "^1.2.4" - }, - "bin": { - "sitemap": "dist/cli.js" - }, + "license": "ISC", "engines": { - "node": ">=14.0.0", - "npm": ">=6.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/sitemap/node_modules/@types/node": { - "version": "17.0.45", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", - "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==", - "dev": true - }, - "node_modules/sitemap/node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "node_modules/trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "devOptional": true, + "node_modules/ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "dev": true, + "license": "MIT", "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" } }, - "node_modules/smob": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/smob/-/smob-1.5.0.tgz", - "integrity": "sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==", - "dev": true - }, - "node_modules/socket.io": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.1.tgz", - "integrity": "sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==", + "node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "license": "MIT", "dependencies": { - "accepts": "~1.3.4", - "base64id": "~2.0.0", - "cors": "~2.8.5", - "debug": "~4.3.2", - "engine.io": "~6.6.0", - "socket.io-adapter": "~2.5.2", - "socket.io-parser": "~4.2.4" + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" }, "engines": { - "node": ">=10.2.0" + "node": ">=6" } }, - "node_modules/socket.io-adapter": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz", - "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==", - "dependencies": { - "debug": "~4.3.4", - "ws": "~8.17.1" + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" } }, - "node_modules/socket.io-adapter/node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/tsx": { + "version": "4.20.6", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.6.tgz", + "integrity": "sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg==", + "license": "MIT", "dependencies": { - "ms": "^2.1.3" + "esbuild": "~0.25.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" }, "engines": { - "node": ">=6.0" + "node": ">=18.0.0" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "optionalDependencies": { + "fsevents": "~2.3.3" } }, - "node_modules/socket.io-client": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.8.1.tgz", - "integrity": "sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ==", + "node_modules/tuf-js": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-2.2.1.tgz", + "integrity": "sha512-GwIJau9XaA8nLVbUXsN3IlFi7WmQ48gBUrl3FTkkL/XLu/POhBzfmX9hd33FNMX1qAsfl6ozO1iMmW9NC8YniA==", "dev": true, + "license": "MIT", "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.2", - "engine.io-client": "~6.6.1", - "socket.io-parser": "~4.2.4" + "@tufjs/models": "2.0.1", + "debug": "^4.3.4", + "make-fetch-happen": "^13.0.1" }, "engines": { - "node": ">=10.0.0" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/socket.io-client/node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, + "license": "MIT", "dependencies": { - "ms": "^2.1.3" + "prelude-ls": "^1.2.1" }, "engines": { - "node": ">=6.0" + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/socket.io-parser": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", - "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "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": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1" + "media-typer": "0.3.0", + "mime-types": "~2.1.24" }, "engines": { - "node": ">=10.0.0" + "node": ">= 0.6" } }, - "node_modules/socket.io-parser/node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", "dependencies": { - "ms": "^2.1.3" + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">= 0.4" } }, - "node_modules/socket.io/node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", "dependencies": { - "ms": "^2.1.3" + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" }, "engines": { - "node": ">=6.0" + "node": ">= 0.4" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/socks": { - "version": "2.8.4", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.4.tgz", - "integrity": "sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==", - "devOptional": true, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "license": "MIT", "dependencies": { - "ip-address": "^9.0.5", - "smart-buffer": "^4.2.0" + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" }, "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/socks-proxy-agent": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", - "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", "dev": true, + "license": "MIT", "dependencies": { - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "socks": "^2.8.3" + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" }, "engines": { - "node": ">= 14" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/sort-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", - "integrity": "sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==", + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", "dev": true, - "dependencies": { - "is-plain-obj": "^1.0.0" + "license": "MIT" + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, "engines": { - "node": ">=4" + "node": ">=14.17" } }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/uc.micro": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", "dev": true, - "engines": { - "node": ">=0.10.0" - } + "license": "MIT" }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "node_modules/ufo": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz", + "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "uglifyjs": "bin/uglifyjs" + }, "engines": { - "node": ">=0.10.0" + "node": ">=0.8.0" } }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "deprecated": "Please use @jridgewell/sourcemap-codec instead", - "dev": true - }, - "node_modules/space-separated-tokens": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", - "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/sparse-bitfield": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", - "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", - "dependencies": { - "memory-pager": "^1.0.2" - } - }, - "node_modules/spawn-please": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/spawn-please/-/spawn-please-2.0.2.tgz", - "integrity": "sha512-KM8coezO6ISQ89c1BzyWNtcn2V2kAVtwIXd3cN/V5a0xPYc1F/vydrRc01wsKFEQ/p+V1a4sw4z2yMITIXrgGw==", + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", "dev": true, + "license": "MIT", "dependencies": { - "cross-spawn": "^7.0.3" + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" }, "engines": { - "node": ">=14" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "node_modules/unconfig": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/unconfig/-/unconfig-7.3.3.tgz", + "integrity": "sha512-QCkQoOnJF8L107gxfHL0uavn7WD9b3dpBcFX6HtfQYmjw2YzWxGuFQ0N0J6tE9oguCBJn9KOvfqYDCMPHIZrBA==", "dev": true, + "license": "MIT", "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" + "@quansync/fs": "^0.1.5", + "defu": "^6.1.4", + "jiti": "^2.5.1", + "quansync": "^0.2.11" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" } }, - "node_modules/spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true + "node_modules/undici-types": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.14.0.tgz", + "integrity": "sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA==", + "license": "MIT" }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "license": "MIT", + "engines": { + "node": ">=4" } }, - "node_modules/spdx-license-ids": { - "version": "3.0.21", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", - "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", - "dev": true - }, - "node_modules/spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", "dev": true, + "license": "MIT", "dependencies": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" }, "engines": { - "node": ">=6.0.0" + "node": ">=4" } }, - "node_modules/spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", + "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", "dev": true, - "dependencies": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" + "license": "MIT", + "engines": { + "node": ">=4" } }, - "node_modules/speakingurl": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", - "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", + "node_modules/unicode-property-aliases-ecmascript": { + "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": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "node_modules/unimport": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/unimport/-/unimport-4.2.0.tgz", + "integrity": "sha512-mYVtA0nmzrysnYnyb3ALMbByJ+Maosee2+WyE0puXl+Xm2bUwPorPaaeZt0ETfuroPOtG8jj1g/qeFZ6buFnag==", "dev": true, + "license": "MIT", "dependencies": { - "through": "2" + "acorn": "^8.14.1", + "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", + "pathe": "^2.0.3", + "picomatch": "^4.0.2", + "pkg-types": "^2.1.0", + "scule": "^1.3.0", + "strip-literal": "^3.0.0", + "tinyglobby": "^0.2.12", + "unplugin": "^2.2.2", + "unplugin-utils": "^0.2.4" }, "engines": { - "node": "*" + "node": ">=18.12.0" } }, - "node_modules/split-on-first": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-3.0.0.tgz", - "integrity": "sha512-qxQJTx2ryR0Dw0ITYyekNQWpz6f8dGd7vffGNflQQ3Iqj9NJ6qiZ7ELpZsJ/QBhIVAiDfXdag3+Gp8RvWa62AA==", + "node_modules/unimport/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -20653,5445 +18086,2645 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/split2": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", - "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "node_modules/unimport/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, - "dependencies": { - "readable-stream": "^3.0.0" + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "devOptional": true - }, - "node_modules/sqlite3": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.7.tgz", - "integrity": "sha512-GGIyOiFaG+TUra3JIfkI/zGP8yZYLPQ0pl1bH+ODjiX57sPhrLU5sQJn1y9bDKZUFYkX1crlrPfSYt0BKKdkog==", + "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, - "hasInstallScript": true, + "license": "MIT", "dependencies": { - "bindings": "^1.5.0", - "node-addon-api": "^7.0.0", - "prebuild-install": "^7.1.1", - "tar": "^6.1.11" - }, - "optionalDependencies": { - "node-gyp": "8.x" + "pathe": "^2.0.3", + "picomatch": "^4.0.3" }, - "peerDependencies": { - "node-gyp": "8.x" + "engines": { + "node": ">=18.12.0" }, - "peerDependenciesMeta": { - "node-gyp": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sxzz" } }, - "node_modules/sqlite3/node_modules/@npmcli/fs": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", - "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", + "node_modules/unique-filename": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", + "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", "dev": true, - "optional": true, + "license": "ISC", "dependencies": { - "@gar/promisify": "^1.0.1", - "semver": "^7.3.5" + "unique-slug": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/sqlite3/node_modules/@npmcli/move-file": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", - "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", - "deprecated": "This functionality has been moved to @npmcli/fs", + "node_modules/unique-slug": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", + "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", "dev": true, - "optional": true, + "license": "ISC", "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" + "imurmurhash": "^0.1.4" }, "engines": { - "node": ">=10" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/sqlite3/node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", "dev": true, - "optional": true, + "license": "MIT", + "dependencies": { + "crypto-random-string": "^2.0.0" + }, "engines": { - "node": ">= 6" + "node": ">=8" } }, - "node_modules/sqlite3/node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true, - "optional": true - }, - "node_modules/sqlite3/node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "optional": true, + "node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "license": "MIT", "dependencies": { - "debug": "4" + "@types/unist": "^3.0.0" }, - "engines": { - "node": ">= 6.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/sqlite3/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "optional": true, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/sqlite3/node_modules/cacache": { - "version": "15.3.0", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", - "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", - "dev": true, - "optional": true, - "dependencies": { - "@npmcli/fs": "^1.0.0", - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" }, - "engines": { - "node": ">= 10" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/sqlite3/node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "optional": true, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "license": "MIT", "dependencies": { - "minipass": "^3.0.0" + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" }, - "engines": { - "node": ">= 8" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/sqlite3/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "optional": true, + "node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "license": "MIT", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/sqlite3/node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "node_modules/universal-user-agent": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", + "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", "dev": true, - "optional": true, - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } + "license": "ISC" }, - "node_modules/sqlite3/node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, - "optional": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, + "license": "MIT", "engines": { - "node": ">= 6" + "node": ">= 10.0.0" } }, - "node_modules/sqlite3/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/unocss": { + "version": "66.5.3", + "resolved": "https://registry.npmjs.org/unocss/-/unocss-66.5.3.tgz", + "integrity": "sha512-tXFfxqPzz3uK0+ZT4vllEQWi95KhIKdssAuKpqcgWXmeEOHnqiDHySWtz82xhRwZzcJ9rcsosQRAuDgU+gnE3Q==", "dev": true, - "optional": true, + "license": "MIT", "dependencies": { - "yallist": "^4.0.0" + "@unocss/astro": "66.5.3", + "@unocss/cli": "66.5.3", + "@unocss/core": "66.5.3", + "@unocss/postcss": "66.5.3", + "@unocss/preset-attributify": "66.5.3", + "@unocss/preset-icons": "66.5.3", + "@unocss/preset-mini": "66.5.3", + "@unocss/preset-tagify": "66.5.3", + "@unocss/preset-typography": "66.5.3", + "@unocss/preset-uno": "66.5.3", + "@unocss/preset-web-fonts": "66.5.3", + "@unocss/preset-wind": "66.5.3", + "@unocss/preset-wind3": "66.5.3", + "@unocss/preset-wind4": "66.5.3", + "@unocss/transformer-attributify-jsx": "66.5.3", + "@unocss/transformer-compile-class": "66.5.3", + "@unocss/transformer-directives": "66.5.3", + "@unocss/transformer-variant-group": "66.5.3", + "@unocss/vite": "66.5.3" }, "engines": { - "node": ">=10" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@unocss/webpack": "66.5.3", + "vite": "^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "@unocss/webpack": { + "optional": true + }, + "vite": { + "optional": true + } } }, - "node_modules/sqlite3/node_modules/make-fetch-happen": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", - "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "dev": true, - "optional": true, - "dependencies": { - "agentkeepalive": "^4.1.3", - "cacache": "^15.2.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^6.0.0", - "minipass": "^3.1.3", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^1.3.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.2", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^6.0.0", - "ssri": "^8.0.0" - }, + "license": "MIT", "engines": { - "node": ">= 10" + "node": ">= 0.8" } }, - "node_modules/sqlite3/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/unplugin": { + "version": "2.3.10", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.3.10.tgz", + "integrity": "sha512-6NCPkv1ClwH+/BGE9QeoTIl09nuiAt0gS28nn1PvYXsGKRwM2TCbFA2QiilmehPDTXIe684k4rZI1yl3A1PCUw==", "dev": true, - "optional": true, + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" + "@jridgewell/remapping": "^2.3.5", + "acorn": "^8.15.0", + "picomatch": "^4.0.3", + "webpack-virtual-modules": "^0.6.2" }, "engines": { - "node": "*" + "node": ">=18.12.0" } }, - "node_modules/sqlite3/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "node_modules/unplugin-auto-import": { + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/unplugin-auto-import/-/unplugin-auto-import-19.3.0.tgz", + "integrity": "sha512-iIi0u4Gq2uGkAOGqlPJOAMI8vocvjh1clGTfSK4SOrJKrt+tirrixo/FjgBwXQNNdS7ofcr7OxzmOb/RjWxeEQ==", "dev": true, - "optional": true, + "license": "MIT", "dependencies": { - "yallist": "^4.0.0" + "local-pkg": "^1.1.1", + "magic-string": "^0.30.17", + "picomatch": "^4.0.2", + "unimport": "^4.2.0", + "unplugin": "^2.3.4", + "unplugin-utils": "^0.2.4" }, "engines": { - "node": ">=8" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@nuxt/kit": "^3.2.2", + "@vueuse/core": "*" + }, + "peerDependenciesMeta": { + "@nuxt/kit": { + "optional": true + }, + "@vueuse/core": { + "optional": true + } } }, - "node_modules/sqlite3/node_modules/minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "node_modules/unplugin-auto-import/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, - "optional": true, - "dependencies": { - "minipass": "^3.0.0" - }, + "license": "MIT", "engines": { - "node": ">= 8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/sqlite3/node_modules/minipass-fetch": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", - "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", + "node_modules/unplugin-auto-import/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, - "optional": true, + "license": "MIT", "dependencies": { - "minipass": "^3.1.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.0.0" + "pathe": "^2.0.3", + "picomatch": "^4.0.3" }, "engines": { - "node": ">=8" + "node": ">=18.12.0" }, - "optionalDependencies": { - "encoding": "^0.1.12" + "funding": { + "url": "https://github.com/sponsors/sxzz" } }, - "node_modules/sqlite3/node_modules/node-gyp": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", - "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", + "node_modules/unplugin-utils": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/unplugin-utils/-/unplugin-utils-0.3.1.tgz", + "integrity": "sha512-5lWVjgi6vuHhJ526bI4nlCOmkCIF3nnfXkCMDeMJrtdvxTs6ZFCM8oNufGTsDbKv/tJ/xj8RpvXjRuPBZJuJog==", "dev": true, - "optional": true, + "license": "MIT", "dependencies": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^9.1.0", - "nopt": "^5.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" + "pathe": "^2.0.3", + "picomatch": "^4.0.3" }, "engines": { - "node": ">= 10.12.0" + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" } }, - "node_modules/sqlite3/node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "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, - "optional": true, - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, + "license": "MIT", "engines": { - "node": ">=6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/sqlite3/node_modules/socks-proxy-agent": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", - "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==", + "node_modules/unplugin-vue-components": { + "version": "28.8.0", + "resolved": "https://registry.npmjs.org/unplugin-vue-components/-/unplugin-vue-components-28.8.0.tgz", + "integrity": "sha512-2Q6ZongpoQzuXDK0ZsVzMoshH0MWZQ1pzVL538G7oIDKRTVzHjppBDS8aB99SADGHN3lpGU7frraCG6yWNoL5Q==", "dev": true, - "optional": true, + "license": "MIT", "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" + "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" }, "engines": { - "node": ">= 10" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@babel/parser": "^7.15.8", + "@nuxt/kit": "^3.2.2 || ^4.0.0", + "vue": "2 || 3" + }, + "peerDependenciesMeta": { + "@babel/parser": { + "optional": true + }, + "@nuxt/kit": { + "optional": true + } } }, - "node_modules/sqlite3/node_modules/ssri": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", - "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", - "dev": true, - "optional": true, + "node_modules/unplugin-vue-components/node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", "dependencies": { - "minipass": "^3.1.1" + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" }, "engines": { - "node": ">= 8" + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/sqlite3/node_modules/unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "node_modules/unplugin-vue-components/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, - "optional": true, + "license": "ISC", "dependencies": { - "unique-slug": "^2.0.0" + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" } }, - "node_modules/sqlite3/node_modules/unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "node_modules/unplugin-vue-components/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, - "optional": true, + "license": "MIT", "dependencies": { - "imurmurhash": "^0.1.4" - } - }, - "node_modules/sqlstring": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz", - "integrity": "sha512-ooAzh/7dxIG5+uDik1z/Rd1vli0+38izZhGzSa34FwR7IbelPWCCKSNIl8jlL/F7ERvy8CB2jNeM1E9i9mXMAQ==", - "dev": true, + "picomatch": "^2.2.1" + }, "engines": { - "node": ">= 0.6" + "node": ">=8.10.0" } }, - "node_modules/ssri": { - "version": "10.0.6", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz", - "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==", + "node_modules/unplugin-vue-components/node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", "dev": true, + "license": "MIT", "dependencies": { - "minipass": "^7.0.3" + "fdir": "^6.5.0", + "picomatch": "^4.0.3" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "engines": { - "node": ">= 0.8" + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/streamx": { - "version": "2.22.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.0.tgz", - "integrity": "sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==", + "node_modules/unplugin-vue-components/node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, - "dependencies": { - "fast-fifo": "^1.3.2", - "text-decoder": "^1.1.0" + "license": "MIT", + "engines": { + "node": ">=12.0.0" }, - "optionalDependencies": { - "bare-events": "^2.2.0" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "peerDependencies": { + "picomatch": "^3 || ^4" }, - "engines": { - "node": ">=8" + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } } }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/unplugin-vue-components/node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/string.prototype.matchall": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", - "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "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": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.6", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.6", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "internal-slot": "^1.1.0", - "regexp.prototype.flags": "^1.5.3", - "set-function-name": "^2.0.2", - "side-channel": "^1.1.0" + "pathe": "^2.0.3", + "picomatch": "^4.0.3" }, "engines": { - "node": ">= 0.4" + "node": ">=18.12.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sxzz" } }, - "node_modules/string.prototype.trim": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", - "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "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, - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-data-property": "^1.1.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-object-atoms": "^1.0.0", - "has-property-descriptors": "^1.0.2" - }, + "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/string.prototype.trimend": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", - "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "node_modules/unplugin/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, + "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "node_modules/upath": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz", + "integrity": "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==", "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, + "license": "MIT", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=4", + "yarn": "*" } }, - "node_modules/stringify-entities": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", - "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", "dependencies": { - "character-entities-html4": "^2.0.0", - "character-entities-legacy": "^3.0.0" + "escalade": "^3.2.0", + "picocolors": "^1.1.1" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" } }, - "node_modules/stringify-object": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", - "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "get-own-enumerable-property-symbols": "^3.0.0", - "is-obj": "^1.0.1", - "is-regexp": "^1.0.0" - }, - "engines": { - "node": ">=4" + "punycode": "^2.1.0" } }, - "node_modules/stringify-object/node_modules/is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "node_modules/urlpattern-polyfill": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.1.0.tgz", + "integrity": "sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw==", "dev": true, - "engines": { - "node": ">=0.10.0" - } + "license": "MIT" }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/utils-merge": { + "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, - "dependencies": { - "ansi-regex": "^5.0.1" - }, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 0.4.0" } }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "node_modules/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", "dev": true, - "engines": { - "node": ">=8" + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" } }, - "node_modules/strip-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", - "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==", + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, - "engines": { - "node": ">=10" + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } }, - "node_modules/strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", + "node_modules/validate-npm-package-name": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", + "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", "dev": true, + "license": "ISC", "engines": { - "node": ">=0.10.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "dev": true, + "license": "MIT", "engines": { - "node": ">=6" + "node": ">= 0.8" } }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", "dependencies": { - "min-indent": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/strip-literal": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.0.0.tgz", - "integrity": "sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==", - "dev": true, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "license": "MIT", "dependencies": { - "js-tokens": "^9.0.1" + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" }, "funding": { - "url": "https://github.com/sponsors/antfu" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/strip-literal/node_modules/js-tokens": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", - "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", - "dev": true - }, - "node_modules/strong-log-transformer": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz", - "integrity": "sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==", + "node_modules/vite": { + "version": "5.4.20", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.20.tgz", + "integrity": "sha512-j3lYzGC3P+B5Yfy/pfKNgVEg4+UtcIJcVRt2cDjIOmhLourAqPqf8P7acgxeiSgUB7E3p2P8/3gNIgDLpwzs4g==", "dev": true, + "license": "MIT", "dependencies": { - "duplexer": "^0.1.1", - "minimist": "^1.2.0", - "through": "^2.3.4" + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" }, "bin": { - "sl-log-transformer": "bin/sl-log-transformer.js" + "vite": "bin/vite.js" }, "engines": { - "node": ">=4" + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } } }, - "node_modules/superagent": { - "version": "10.2.3", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-10.2.3.tgz", - "integrity": "sha512-y/hkYGeXAj7wUMjxRbB21g/l6aAEituGXM9Rwl4o20+SX3e8YOSV6BxFXl+dL3Uk0mjSL3kCbNkwURm8/gEDig==", + "node_modules/vite-node": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz", + "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==", "dev": true, "license": "MIT", "dependencies": { - "component-emitter": "^1.3.1", - "cookiejar": "^2.1.4", - "debug": "^4.3.7", - "fast-safe-stringify": "^2.1.1", - "form-data": "^4.0.4", - "formidable": "^3.5.4", - "methods": "^1.1.2", - "mime": "2.6.0", - "qs": "^6.11.2" + "cac": "^6.7.14", + "debug": "^4.4.1", + "es-module-lexer": "^1.7.0", + "pathe": "^2.0.3", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + }, + "bin": { + "vite-node": "vite-node.mjs" }, "engines": { - "node": ">=14.18.0" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/superagent/node_modules/formidable": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.4.tgz", - "integrity": "sha512-YikH+7CUTOtP44ZTnUhR7Ic2UASBPOqmaRkRKxRbywPTe5VxF7RRCck4af9wutiZ/QKM5nME9Bie2fFaPz5Gug==", + "node_modules/vite-plugin-pwa": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/vite-plugin-pwa/-/vite-plugin-pwa-1.0.3.tgz", + "integrity": "sha512-/OpqIpUldALGxcsEnv/ekQiQ5xHkQ53wcoN5ewX4jiIDNGs3W+eNcI1WYZeyOLmzoEjg09D7aX0O89YGjen1aw==", "dev": true, + "license": "MIT", "dependencies": { - "@paralleldrive/cuid2": "^2.2.2", - "dezalgo": "^1.0.4", - "once": "^1.4.0" + "debug": "^4.3.6", + "pretty-bytes": "^6.1.1", + "tinyglobby": "^0.2.10", + "workbox-build": "^7.3.0", + "workbox-window": "^7.3.0" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" }, "funding": { - "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, - "bin": { - "mime": "cli.js" + "url": "https://github.com/sponsors/antfu" }, - "engines": { - "node": ">=4.0.0" + "peerDependencies": { + "@vite-pwa/assets-generator": "^1.0.0", + "vite": "^3.1.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", + "workbox-build": "^7.3.0", + "workbox-window": "^7.3.0" + }, + "peerDependenciesMeta": { + "@vite-pwa/assets-generator": { + "optional": true + } } }, - "node_modules/superjson": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.2.tgz", - "integrity": "sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==", + "node_modules/vite/node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], "dev": true, - "dependencies": { - "copy-anything": "^3.0.2" - }, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], "engines": { - "node": ">=16" + "node": ">=12" } }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=12" } }, - "node_modules/synckit": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.4.tgz", - "integrity": "sha512-Q/XQKRaJiLiFIBNN+mndW7S/RHxvwzuZS6ZwmRzUBqJBv/5QIKCEwkBC8GBf8EQJKYnaFs0wOZbKTXBPj8L9oQ==", + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@pkgr/core": "^0.2.3", - "tslib": "^2.8.1" - }, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/synckit" + "node": ">=12" } }, - "node_modules/tabbable": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", - "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", - "dev": true - }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=6" + "node": ">=12" } }, - "node_modules/tar": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", - "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=10" + "node": ">=12" } }, - "node_modules/tar-fs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.2.tgz", - "integrity": "sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==", + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" } }, - "node_modules/tar-fs/node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=6" + "node": ">=12" } }, - "node_modules/tar/node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 8" + "node": ">=12" } }, - "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/tar/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/tarn": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/tarn/-/tarn-3.0.2.tgz", - "integrity": "sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ==", + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8.0.0" + "node": ">=12" } }, - "node_modules/tedious": { - "version": "18.6.1", - "resolved": "https://registry.npmjs.org/tedious/-/tedious-18.6.1.tgz", - "integrity": "sha512-9AvErXXQTd6l7TDd5EmM+nxbOGyhnmdbp/8c3pw+tjaiSXW9usME90ET/CRG1LN1Y9tPMtz/p83z4Q97B4DDpw==", + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], "dev": true, - "dependencies": { - "@azure/core-auth": "^1.7.2", - "@azure/identity": "^4.2.1", - "@azure/keyvault-keys": "^4.4.0", - "@js-joda/core": "^5.6.1", - "@types/node": ">=18", - "bl": "^6.0.11", - "iconv-lite": "^0.6.3", - "js-md4": "^0.3.2", - "native-duplexpair": "^1.0.0", - "sprintf-js": "^1.1.3" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=18" + "node": ">=12" } }, - "node_modules/tedious/node_modules/bl": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-6.1.0.tgz", - "integrity": "sha512-ClDyJGQkc8ZtzdAAbAwBmhMSpwN/sC9HA8jxdYm6nVUbCfZbe2mgza4qh7AuEYyEPB/c4Kznf9s66bnsKMQDjw==", + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], "dev": true, - "dependencies": { - "@types/readable-stream": "^4.0.0", - "buffer": "^6.0.3", - "inherits": "^2.0.4", - "readable-stream": "^4.2.0" + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/tedious/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" + "engines": { + "node": ">=12" } }, - "node_modules/tedious/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, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/tedious/node_modules/readable-stream": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", - "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=12" } }, - "node_modules/temp-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", - "integrity": "sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==", + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": ">=4" + "node": ">=12" } }, - "node_modules/tempy": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz", - "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==", + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "is-stream": "^2.0.0", - "temp-dir": "^2.0.0", - "type-fest": "^0.16.0", - "unique-string": "^2.0.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12" } }, - "node_modules/tempy/node_modules/crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/tempy/node_modules/temp-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", - "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/tempy/node_modules/type-fest": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", - "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12" } }, - "node_modules/tempy/node_modules/unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "crypto-random-string": "^2.0.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/terser": { - "version": "5.39.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.39.0.tgz", - "integrity": "sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==", + "node_modules/vite/node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "dev": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, + "hasInstallScript": true, + "license": "MIT", "bin": { - "terser": "bin/terser" + "esbuild": "bin/esbuild" }, "engines": { - "node": ">=10" + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" } }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.14", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", - "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", + "node_modules/vitepress": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.6.4.tgz", + "integrity": "sha512-+2ym1/+0VVrbhNyRoFFesVvBvHAVMZMK0rw60E3X/5349M1GuVdKeazuksqopEdvkKwKGs21Q729jX81/bkBJg==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", - "jest-worker": "^27.4.5", - "schema-utils": "^4.3.0", - "serialize-javascript": "^6.0.2", - "terser": "^5.31.1" - }, - "engines": { - "node": ">= 10.13.0" + "@docsearch/css": "3.8.2", + "@docsearch/js": "3.8.2", + "@iconify-json/simple-icons": "^1.2.21", + "@shikijs/core": "^2.1.0", + "@shikijs/transformers": "^2.1.0", + "@shikijs/types": "^2.1.0", + "@types/markdown-it": "^14.1.2", + "@vitejs/plugin-vue": "^5.2.1", + "@vue/devtools-api": "^7.7.0", + "@vue/shared": "^3.5.13", + "@vueuse/core": "^12.4.0", + "@vueuse/integrations": "^12.4.0", + "focus-trap": "^7.6.4", + "mark.js": "8.11.1", + "minisearch": "^7.1.1", + "shiki": "^2.1.0", + "vite": "^5.4.14", + "vue": "^3.5.13" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "bin": { + "vitepress": "bin/vitepress.js" }, "peerDependencies": { - "webpack": "^5.1.0" + "markdown-it-mathjax3": "^4", + "postcss": "^8" }, "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { + "markdown-it-mathjax3": { "optional": true }, - "uglify-js": { + "postcss": { "optional": true } } }, - "node_modules/terser-webpack-plugin/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "node_modules/vitepress-plugin-google-analytics": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/vitepress-plugin-google-analytics/-/vitepress-plugin-google-analytics-1.0.2.tgz", + "integrity": "sha512-ri8bFUAmt3c/DtPrALauGBIUr2gIJ11c1qNRhwd3/+aiuYZBfQpOosSxcO1AswgwRxP9FwBS6Z7jgdDVyXb2hA==", "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true + "license": "MIT" }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "node_modules/vitepress-plugin-search": { + "version": "1.0.4-alpha.22", + "resolved": "https://registry.npmjs.org/vitepress-plugin-search/-/vitepress-plugin-search-1.0.4-alpha.22.tgz", + "integrity": "sha512-IAOEJu+kjVY+0pb6/PeRjIbr175HFFbnMdLmLjqcy7VWxkabIRZbLoQL1VUYDZl804o/Or+GaX02gsiMOnVxFA==", "dev": true, + "license": "MIT", "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" + "@types/flexsearch": "^0.7.3", + "@types/markdown-it": "^12.2.3", + "glob-to-regexp": "^0.4.1", + "markdown-it": "^13.0.1" }, "engines": { - "node": ">=8" + "node": "^14.13.1 || ^16.7.0 || >=18" + }, + "peerDependencies": { + "flexsearch": "^0.7.31", + "vitepress": "^1.0.0-rc.35", + "vue": "3" } }, - "node_modules/test-exclude/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, + "node_modules/vitepress-plugin-search/node_modules/@types/markdown-it": { + "version": "12.2.3", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-12.2.3.tgz", + "integrity": "sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==", + "dev": true, + "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@types/linkify-it": "*", + "@types/mdurl": "*" } }, - "node_modules/test-exclude/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "node_modules/vitepress-plugin-search/node_modules/entities": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", + "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, + "license": "BSD-2-Clause", "engines": { - "node": "*" + "node": ">=0.12" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/test-exclude/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/vitepress-plugin-search/node_modules/linkify-it": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.1.tgz", + "integrity": "sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==", "dev": true, + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" + "uc.micro": "^1.0.1" } }, - "node_modules/text-decoder": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", - "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", + "node_modules/vitepress-plugin-search/node_modules/markdown-it": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.2.tgz", + "integrity": "sha512-FtwnEuuK+2yVU7goGn/MJ0WBZMM9ZPgU9spqlFs7/A/pDIUNSOQZhUgOqYCficIuR2QaFnrt8LHqBWsbTAoI5w==", "dev": true, + "license": "MIT", "dependencies": { - "b4a": "^1.6.4" + "argparse": "^2.0.1", + "entities": "~3.0.1", + "linkify-it": "^4.0.1", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + }, + "bin": { + "markdown-it": "bin/markdown-it.js" } }, - "node_modules/text-extensions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", - "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", + "node_modules/vitepress-plugin-search/node_modules/mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true + "license": "MIT" }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true + "node_modules/vitepress-plugin-search/node_modules/uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", + "dev": true, + "license": "MIT" }, - "node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "node_modules/vitepress/node_modules/@shikijs/core": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-2.5.0.tgz", + "integrity": "sha512-uu/8RExTKtavlpH7XqnVYBrfBkUc20ngXiX9NSrBhOVZYv/7XQRKUyhtkeflY5QsxC0GbJThCerruZfsUaSldg==", "dev": true, + "license": "MIT", "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" + "@shikijs/engine-javascript": "2.5.0", + "@shikijs/engine-oniguruma": "2.5.0", + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.4" } }, - "node_modules/through2/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "node_modules/vitepress/node_modules/@shikijs/engine-javascript": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-2.5.0.tgz", + "integrity": "sha512-VjnOpnQf8WuCEZtNUdjjwGUbtAVKuZkVQ/5cHy/tojVVRIRtlWMYVjyWhxOmIq05AlSOv72z7hRNRGVBgQOl0w==", "dev": true, + "license": "MIT", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2", + "oniguruma-to-es": "^3.1.0" } }, - "node_modules/through2/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/through2/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "node_modules/vitepress/node_modules/@shikijs/engine-oniguruma": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-2.5.0.tgz", + "integrity": "sha512-pGd1wRATzbo/uatrCIILlAdFVKdxImWJGQ5rFiB5VZi2ve5xj3Ax9jny8QvkaV93btQEwR/rSz5ERFpC5mKNIw==", "dev": true, + "license": "MIT", "dependencies": { - "safe-buffer": "~5.1.0" + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2" } }, - "node_modules/tildify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tildify/-/tildify-2.0.0.tgz", - "integrity": "sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==", + "node_modules/vitepress/node_modules/@shikijs/langs": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-2.5.0.tgz", + "integrity": "sha512-Qfrrt5OsNH5R+5tJ/3uYBBZv3SuGmnRPejV9IlIbFH3HTGLDlkqgHymAlzklVmKBjAaVmkPkyikAV/sQ1wSL+w==", "dev": true, - "engines": { - "node": ">=8" + "license": "MIT", + "dependencies": { + "@shikijs/types": "2.5.0" } }, - "node_modules/tinyexec": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.1.tgz", - "integrity": "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinyglobby": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", - "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "node_modules/vitepress/node_modules/@shikijs/themes": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-2.5.0.tgz", + "integrity": "sha512-wGrk+R8tJnO0VMzmUExHR+QdSaPUl/NKs+a4cQQRWyoc3YFbUzuLEi/KWK1hj+8BfHRKm2jNhhJck1dfstJpiw==", "dev": true, "license": "MIT", "dependencies": { - "fdir": "^6.4.4", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" + "@shikijs/types": "2.5.0" } }, - "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.4.4", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", - "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", + "node_modules/vitepress/node_modules/@shikijs/types": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-2.5.0.tgz", + "integrity": "sha512-ygl5yhxki9ZLNuNpPitBWvcy9fsSKKaRuO4BAlMyagszQidxcpLAr0qiW/q43DtSIDxO6hEbtYLiFZNXO/hdGw==", "dev": true, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" } }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "node_modules/vitepress/node_modules/@vitejs/plugin-vue": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz", + "integrity": "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==", "dev": true, + "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/tldts": { - "version": "6.1.86", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz", - "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==", - "dev": true, - "dependencies": { - "tldts-core": "^6.1.86" - }, - "bin": { - "tldts": "bin/cli.js" - } - }, - "node_modules/tldts-core": { - "version": "6.1.86", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz", - "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==", - "dev": true - }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dependencies": { - "os-tmpdir": "~1.0.2" + "node": "^18.0.0 || >=20.0.0" }, - "engines": { - "node": ">=0.6.0" + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0", + "vue": "^3.2.25" } }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "node_modules/vitepress/node_modules/@vueuse/core": { + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-12.8.2.tgz", + "integrity": "sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ==", "dev": true, + "license": "MIT", "dependencies": { - "is-number": "^7.0.0" + "@types/web-bluetooth": "^0.0.21", + "@vueuse/metadata": "12.8.2", + "@vueuse/shared": "12.8.2", + "vue": "^3.5.13" }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "engines": { - "node": ">=0.6" + "funding": { + "url": "https://github.com/sponsors/antfu" } }, - "node_modules/totalist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", - "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "node_modules/vitepress/node_modules/@vueuse/metadata": { + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-12.8.2.tgz", + "integrity": "sha512-rAyLGEuoBJ/Il5AmFHiziCPdQzRt88VxR+Y/A/QhJ1EWtWqPBBAxTAFaSkviwEuOEZNtW8pvkPgoCZQ+HxqW1A==", "dev": true, "license": "MIT", - "engines": { - "node": ">=6" + "funding": { + "url": "https://github.com/sponsors/antfu" } }, - "node_modules/tough-cookie": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz", - "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==", + "node_modules/vitepress/node_modules/@vueuse/shared": { + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-12.8.2.tgz", + "integrity": "sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w==", "dev": true, + "license": "MIT", "dependencies": { - "tldts": "^6.1.32" + "vue": "^3.5.13" }, - "engines": { - "node": ">=16" + "funding": { + "url": "https://github.com/sponsors/antfu" } }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "node_modules/treeverse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/treeverse/-/treeverse-3.0.0.tgz", - "integrity": "sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/trim-lines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", - "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ts-algebra": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ts-algebra/-/ts-algebra-2.0.0.tgz", - "integrity": "sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw==" - }, - "node_modules/ts-api-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", - "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", - "dev": true, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, - "node_modules/ts-loader": { - "version": "9.5.2", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.2.tgz", - "integrity": "sha512-Qo4piXvOTWcMGIgRiuFa6nHNm+54HbYaZCKqc9eeZCLRy3XqafQgwX2F7mofrbJG3g7EEb+lkiR+z2Lic2s3Zw==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "enhanced-resolve": "^5.0.0", - "micromatch": "^4.0.0", - "semver": "^7.3.4", - "source-map": "^0.7.4" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "typescript": "*", - "webpack": "^5.0.0" - } - }, - "node_modules/ts-loader/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/ts-loader/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/ts-loader/node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "dev": true, - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/ts-node/node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/tsconfig-paths": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", - "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", - "dev": true, - "dependencies": { - "json5": "^2.2.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tsconfig-paths/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" - }, - "node_modules/tsscmp": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", - "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==", - "engines": { - "node": ">=0.6.x" - } - }, - "node_modules/tsx": { - "version": "4.20.3", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.3.tgz", - "integrity": "sha512-qjbnuR9Tr+FJOMBqJCW5ehvIo/buZq7vH7qD7JziU98h6l3qGy0a/yPFjwO+y0/T7GFpNgNAvEcPPVfyT8rrPQ==", - "license": "MIT", - "dependencies": { - "esbuild": "~0.25.0", - "get-tsconfig": "^4.7.5" - }, - "bin": { - "tsx": "dist/cli.mjs" - }, - "engines": { - "node": ">=18.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - } - }, - "node_modules/tuf-js": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-2.2.1.tgz", - "integrity": "sha512-GwIJau9XaA8nLVbUXsN3IlFi7WmQ48gBUrl3FTkkL/XLu/POhBzfmX9hd33FNMX1qAsfl6ozO1iMmW9NC8YniA==", - "dev": true, - "dependencies": { - "@tufjs/models": "2.0.1", - "debug": "^4.3.4", - "make-fetch-happen": "^13.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", - "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", - "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", - "dev": true, - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", - "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", - "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.15", - "reflect.getprototypeof": "^1.0.9" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", - "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0", - "reflect.getprototypeof": "^1.0.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", - "dev": true - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/typescript": { - "version": "5.9.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", - "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", - "devOptional": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/uc.micro": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", - "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", - "dev": true - }, - "node_modules/ufo": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz", - "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", - "dev": true - }, - "node_modules/uglify-js": { - "version": "3.19.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", - "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", - "dev": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/unbox-primitive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", - "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", - "dev": true, - "dependencies": { - "call-bound": "^1.0.3", - "has-bigints": "^1.0.2", - "has-symbols": "^1.1.0", - "which-boxed-primitive": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/unconfig": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/unconfig/-/unconfig-7.3.2.tgz", - "integrity": "sha512-nqG5NNL2wFVGZ0NA/aCFw0oJ2pxSf1lwg4Z5ill8wd7K4KX/rQbHlwbh+bjctXL5Ly1xtzHenHGOK0b+lG6JVg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@quansync/fs": "^0.1.1", - "defu": "^6.1.4", - "jiti": "^2.4.2", - "quansync": "^0.2.8" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/undici-types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz", - "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==", - "license": "MIT" - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", - "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", - "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "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==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unimport": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/unimport/-/unimport-4.2.0.tgz", - "integrity": "sha512-mYVtA0nmzrysnYnyb3ALMbByJ+Maosee2+WyE0puXl+Xm2bUwPorPaaeZt0ETfuroPOtG8jj1g/qeFZ6buFnag==", - "dev": true, - "dependencies": { - "acorn": "^8.14.1", - "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", - "pathe": "^2.0.3", - "picomatch": "^4.0.2", - "pkg-types": "^2.1.0", - "scule": "^1.3.0", - "strip-literal": "^3.0.0", - "tinyglobby": "^0.2.12", - "unplugin": "^2.2.2", - "unplugin-utils": "^0.2.4" - }, - "engines": { - "node": ">=18.12.0" - } - }, - "node_modules/unimport/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/unimport/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/unique-filename": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", - "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", - "dev": true, - "dependencies": { - "unique-slug": "^4.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/unique-slug": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", - "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/unique-string": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", - "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", - "dev": true, - "dependencies": { - "crypto-random-string": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/unist-util-is": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", - "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-position": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", - "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-stringify-position": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", - "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", - "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit-parents": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", - "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/universal-user-agent": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", - "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", - "dev": true - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unocss": { - "version": "66.3.3", - "resolved": "https://registry.npmjs.org/unocss/-/unocss-66.3.3.tgz", - "integrity": "sha512-HSB+K4/EbouwYmxpPU52cg0exua7PUr2IAJZBV3iai6tPdMcJ0c8jXaw7G+2L+ffruVFTcS0e2kE4OrR8BKDLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@unocss/astro": "66.3.3", - "@unocss/cli": "66.3.3", - "@unocss/core": "66.3.3", - "@unocss/postcss": "66.3.3", - "@unocss/preset-attributify": "66.3.3", - "@unocss/preset-icons": "66.3.3", - "@unocss/preset-mini": "66.3.3", - "@unocss/preset-tagify": "66.3.3", - "@unocss/preset-typography": "66.3.3", - "@unocss/preset-uno": "66.3.3", - "@unocss/preset-web-fonts": "66.3.3", - "@unocss/preset-wind": "66.3.3", - "@unocss/preset-wind3": "66.3.3", - "@unocss/preset-wind4": "66.3.3", - "@unocss/transformer-attributify-jsx": "66.3.3", - "@unocss/transformer-compile-class": "66.3.3", - "@unocss/transformer-directives": "66.3.3", - "@unocss/transformer-variant-group": "66.3.3", - "@unocss/vite": "66.3.3" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@unocss/webpack": "66.3.3", - "vite": "^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0" - }, - "peerDependenciesMeta": { - "@unocss/webpack": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/unplugin": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.3.5.tgz", - "integrity": "sha512-RyWSb5AHmGtjjNQ6gIlA67sHOsWpsbWpwDokLwTcejVdOjEkJZh7QKu14J00gDDVSh8kGH4KYC/TNBceXFZhtw==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.14.1", - "picomatch": "^4.0.2", - "webpack-virtual-modules": "^0.6.2" - }, - "engines": { - "node": ">=18.12.0" - } - }, - "node_modules/unplugin-auto-import": { - "version": "19.3.0", - "resolved": "https://registry.npmjs.org/unplugin-auto-import/-/unplugin-auto-import-19.3.0.tgz", - "integrity": "sha512-iIi0u4Gq2uGkAOGqlPJOAMI8vocvjh1clGTfSK4SOrJKrt+tirrixo/FjgBwXQNNdS7ofcr7OxzmOb/RjWxeEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "local-pkg": "^1.1.1", - "magic-string": "^0.30.17", - "picomatch": "^4.0.2", - "unimport": "^4.2.0", - "unplugin": "^2.3.4", - "unplugin-utils": "^0.2.4" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@nuxt/kit": "^3.2.2", - "@vueuse/core": "*" - }, - "peerDependenciesMeta": { - "@nuxt/kit": { - "optional": true - }, - "@vueuse/core": { - "optional": true - } - } - }, - "node_modules/unplugin-auto-import/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/unplugin-utils": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/unplugin-utils/-/unplugin-utils-0.2.4.tgz", - "integrity": "sha512-8U/MtpkPkkk3Atewj1+RcKIjb5WBimZ/WSLhhR3w6SsIj8XJuKTacSP8g+2JhfSGw0Cb125Y+2zA/IzJZDVbhA==", - "dev": true, - "dependencies": { - "pathe": "^2.0.2", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=18.12.0" - }, - "funding": { - "url": "https://github.com/sponsors/sxzz" - } - }, - "node_modules/unplugin-utils/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/unplugin-vue-components": { - "version": "28.8.0", - "resolved": "https://registry.npmjs.org/unplugin-vue-components/-/unplugin-vue-components-28.8.0.tgz", - "integrity": "sha512-2Q6ZongpoQzuXDK0ZsVzMoshH0MWZQ1pzVL538G7oIDKRTVzHjppBDS8aB99SADGHN3lpGU7frraCG6yWNoL5Q==", - "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" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@babel/parser": "^7.15.8", - "@nuxt/kit": "^3.2.2 || ^4.0.0", - "vue": "2 || 3" - }, - "peerDependenciesMeta": { - "@babel/parser": { - "optional": true - }, - "@nuxt/kit": { - "optional": true - } - } - }, - "node_modules/unplugin-vue-components/node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/unplugin-vue-components/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/unplugin-vue-components/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/unplugin/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/untildify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", - "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/upath": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz", - "integrity": "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==", - "dev": true, - "engines": { - "node": ">=4", - "yarn": "*" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/update-notifier": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-6.0.2.tgz", - "integrity": "sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==", - "dev": true, - "dependencies": { - "boxen": "^7.0.0", - "chalk": "^5.0.1", - "configstore": "^6.0.0", - "has-yarn": "^3.0.0", - "import-lazy": "^4.0.0", - "is-ci": "^3.0.1", - "is-installed-globally": "^0.4.0", - "is-npm": "^6.0.0", - "is-yarn-global": "^0.4.0", - "latest-version": "^7.0.0", - "pupa": "^3.1.0", - "semver": "^7.3.7", - "semver-diff": "^4.0.0", - "xdg-basedir": "^5.1.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/yeoman/update-notifier?sponsor=1" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", - "dev": true, - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, - "node_modules/v8-to-istanbul": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", - "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/v8-to-istanbul/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/validate-npm-package-name": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", - "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/vfile": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", - "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", - "dependencies": { - "@types/unist": "^3.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-message": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", - "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vite": { - "version": "6.3.4", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.4.tgz", - "integrity": "sha512-BiReIiMS2fyFqbqNT/Qqt4CVITDU9M9vE+DKcVAsB+ZV0wvTKd+3hMbkpxz1b+NmEDMegpVbisKiAZOnvO92Sw==", - "dev": true, - "peer": true, - "dependencies": { - "esbuild": "^0.25.0", - "fdir": "^6.4.4", - "picomatch": "^4.0.2", - "postcss": "^8.5.3", - "rollup": "^4.34.9", - "tinyglobby": "^0.2.13" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "jiti": ">=1.21.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/vite-plugin-pwa": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/vite-plugin-pwa/-/vite-plugin-pwa-1.0.2.tgz", - "integrity": "sha512-O3UwjsCnoDclgJANoOgzzqW7SFgwXE/th2OmUP/ILxHKwzWxxKDBu+B/Xa9Cv4IgSVSnj2HgRVIJ7F15+vQFkA==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.6", - "pretty-bytes": "^6.1.1", - "tinyglobby": "^0.2.10", - "workbox-build": "^7.3.0", - "workbox-window": "^7.3.0" - }, - "engines": { - "node": ">=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@vite-pwa/assets-generator": "^1.0.0", - "vite": "^3.1.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", - "workbox-build": "^7.3.0", - "workbox-window": "^7.3.0" - }, - "peerDependenciesMeta": { - "@vite-pwa/assets-generator": { - "optional": true - } - } - }, - "node_modules/vite/node_modules/fdir": { - "version": "6.4.4", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", - "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", - "dev": true, - "peer": true, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/vite/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/vitepress": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.6.3.tgz", - "integrity": "sha512-fCkfdOk8yRZT8GD9BFqusW3+GggWYZ/rYncOfmgcDtP3ualNHCAg+Robxp2/6xfH1WwPHtGpPwv7mbA3qomtBw==", - "dev": true, - "dependencies": { - "@docsearch/css": "3.8.2", - "@docsearch/js": "3.8.2", - "@iconify-json/simple-icons": "^1.2.21", - "@shikijs/core": "^2.1.0", - "@shikijs/transformers": "^2.1.0", - "@shikijs/types": "^2.1.0", - "@types/markdown-it": "^14.1.2", - "@vitejs/plugin-vue": "^5.2.1", - "@vue/devtools-api": "^7.7.0", - "@vue/shared": "^3.5.13", - "@vueuse/core": "^12.4.0", - "@vueuse/integrations": "^12.4.0", - "focus-trap": "^7.6.4", - "mark.js": "8.11.1", - "minisearch": "^7.1.1", - "shiki": "^2.1.0", - "vite": "^5.4.14", - "vue": "^3.5.13" - }, - "bin": { - "vitepress": "bin/vitepress.js" - }, - "peerDependencies": { - "markdown-it-mathjax3": "^4", - "postcss": "^8" - }, - "peerDependenciesMeta": { - "markdown-it-mathjax3": { - "optional": true - }, - "postcss": { - "optional": true - } - } - }, - "node_modules/vitepress-plugin-google-analytics": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/vitepress-plugin-google-analytics/-/vitepress-plugin-google-analytics-1.0.2.tgz", - "integrity": "sha512-ri8bFUAmt3c/DtPrALauGBIUr2gIJ11c1qNRhwd3/+aiuYZBfQpOosSxcO1AswgwRxP9FwBS6Z7jgdDVyXb2hA==", - "dev": true - }, - "node_modules/vitepress-plugin-search": { - "version": "1.0.4-alpha.22", - "resolved": "https://registry.npmjs.org/vitepress-plugin-search/-/vitepress-plugin-search-1.0.4-alpha.22.tgz", - "integrity": "sha512-IAOEJu+kjVY+0pb6/PeRjIbr175HFFbnMdLmLjqcy7VWxkabIRZbLoQL1VUYDZl804o/Or+GaX02gsiMOnVxFA==", - "dev": true, - "dependencies": { - "@types/flexsearch": "^0.7.3", - "@types/markdown-it": "^12.2.3", - "glob-to-regexp": "^0.4.1", - "markdown-it": "^13.0.1" - }, - "engines": { - "node": "^14.13.1 || ^16.7.0 || >=18" - }, - "peerDependencies": { - "flexsearch": "^0.7.31", - "vitepress": "^1.0.0-rc.35", - "vue": "3" - } - }, - "node_modules/vitepress-plugin-search/node_modules/@types/markdown-it": { - "version": "12.2.3", - "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-12.2.3.tgz", - "integrity": "sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==", - "dev": true, - "dependencies": { - "@types/linkify-it": "*", - "@types/mdurl": "*" - } - }, - "node_modules/vitepress-plugin-search/node_modules/entities": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", - "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", - "dev": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/vitepress-plugin-search/node_modules/linkify-it": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.1.tgz", - "integrity": "sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==", - "dev": true, - "dependencies": { - "uc.micro": "^1.0.1" - } - }, - "node_modules/vitepress-plugin-search/node_modules/markdown-it": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.2.tgz", - "integrity": "sha512-FtwnEuuK+2yVU7goGn/MJ0WBZMM9ZPgU9spqlFs7/A/pDIUNSOQZhUgOqYCficIuR2QaFnrt8LHqBWsbTAoI5w==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1", - "entities": "~3.0.1", - "linkify-it": "^4.0.1", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" - }, - "bin": { - "markdown-it": "bin/markdown-it.js" - } - }, - "node_modules/vitepress-plugin-search/node_modules/mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", - "dev": true - }, - "node_modules/vitepress-plugin-search/node_modules/uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", - "dev": true - }, - "node_modules/vitepress/node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitepress/node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitepress/node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitepress/node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitepress/node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitepress/node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitepress/node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitepress/node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitepress/node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitepress/node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitepress/node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitepress/node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitepress/node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitepress/node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitepress/node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitepress/node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitepress/node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitepress/node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitepress/node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitepress/node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitepress/node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitepress/node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitepress/node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vitepress/node_modules/@shikijs/core": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-2.5.0.tgz", - "integrity": "sha512-uu/8RExTKtavlpH7XqnVYBrfBkUc20ngXiX9NSrBhOVZYv/7XQRKUyhtkeflY5QsxC0GbJThCerruZfsUaSldg==", - "dev": true, - "dependencies": { - "@shikijs/engine-javascript": "2.5.0", - "@shikijs/engine-oniguruma": "2.5.0", - "@shikijs/types": "2.5.0", - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4", - "hast-util-to-html": "^9.0.4" - } - }, - "node_modules/vitepress/node_modules/@shikijs/engine-javascript": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-2.5.0.tgz", - "integrity": "sha512-VjnOpnQf8WuCEZtNUdjjwGUbtAVKuZkVQ/5cHy/tojVVRIRtlWMYVjyWhxOmIq05AlSOv72z7hRNRGVBgQOl0w==", - "dev": true, - "dependencies": { - "@shikijs/types": "2.5.0", - "@shikijs/vscode-textmate": "^10.0.2", - "oniguruma-to-es": "^3.1.0" - } - }, - "node_modules/vitepress/node_modules/@shikijs/engine-oniguruma": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-2.5.0.tgz", - "integrity": "sha512-pGd1wRATzbo/uatrCIILlAdFVKdxImWJGQ5rFiB5VZi2ve5xj3Ax9jny8QvkaV93btQEwR/rSz5ERFpC5mKNIw==", - "dev": true, - "dependencies": { - "@shikijs/types": "2.5.0", - "@shikijs/vscode-textmate": "^10.0.2" - } - }, - "node_modules/vitepress/node_modules/@shikijs/langs": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-2.5.0.tgz", - "integrity": "sha512-Qfrrt5OsNH5R+5tJ/3uYBBZv3SuGmnRPejV9IlIbFH3HTGLDlkqgHymAlzklVmKBjAaVmkPkyikAV/sQ1wSL+w==", - "dev": true, - "dependencies": { - "@shikijs/types": "2.5.0" - } - }, - "node_modules/vitepress/node_modules/@shikijs/themes": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-2.5.0.tgz", - "integrity": "sha512-wGrk+R8tJnO0VMzmUExHR+QdSaPUl/NKs+a4cQQRWyoc3YFbUzuLEi/KWK1hj+8BfHRKm2jNhhJck1dfstJpiw==", - "dev": true, - "dependencies": { - "@shikijs/types": "2.5.0" - } - }, - "node_modules/vitepress/node_modules/@shikijs/types": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-2.5.0.tgz", - "integrity": "sha512-ygl5yhxki9ZLNuNpPitBWvcy9fsSKKaRuO4BAlMyagszQidxcpLAr0qiW/q43DtSIDxO6hEbtYLiFZNXO/hdGw==", - "dev": true, - "dependencies": { - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4" - } - }, - "node_modules/vitepress/node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" - } - }, - "node_modules/vitepress/node_modules/oniguruma-to-es": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-3.1.1.tgz", - "integrity": "sha512-bUH8SDvPkH3ho3dvwJwfonjlQ4R80vjyvrU8YpxuROddv55vAEJrTuCuCVUhhsHbtlD9tGGbaNApGQckXhS8iQ==", - "dev": true, - "dependencies": { - "emoji-regex-xs": "^1.0.0", - "regex": "^6.0.1", - "regex-recursion": "^6.0.2" - } - }, - "node_modules/vitepress/node_modules/shiki": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-2.5.0.tgz", - "integrity": "sha512-mI//trrsaiCIPsja5CNfsyNOqgAZUb6VpJA+340toL42UpzQlXpwRV9nch69X6gaUxrr9kaOOa6e3y3uAkGFxQ==", - "dev": true, - "dependencies": { - "@shikijs/core": "2.5.0", - "@shikijs/engine-javascript": "2.5.0", - "@shikijs/engine-oniguruma": "2.5.0", - "@shikijs/langs": "2.5.0", - "@shikijs/themes": "2.5.0", - "@shikijs/types": "2.5.0", - "@shikijs/vscode-textmate": "^10.0.2", - "@types/hast": "^3.0.4" - } - }, - "node_modules/vitepress/node_modules/vite": { - "version": "5.4.19", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.19.tgz", - "integrity": "sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==", - "dev": true, - "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/vue": { - "version": "3.5.18", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.18.tgz", - "integrity": "sha512-7W4Y4ZbMiQ3SEo+m9lnoNpV9xG7QVMLa+/0RFwwiAVkeYoyGXqWE85jabU4pllJNUzqfLShJ5YLptewhCWUgNA==", - "license": "MIT", - "dependencies": { - "@vue/compiler-dom": "3.5.18", - "@vue/compiler-sfc": "3.5.18", - "@vue/runtime-dom": "3.5.18", - "@vue/server-renderer": "3.5.18", - "@vue/shared": "3.5.18" - }, - "peerDependencies": { - "typescript": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/vue-flow-layout": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/vue-flow-layout/-/vue-flow-layout-0.1.1.tgz", - "integrity": "sha512-JdgRRUVrN0Y2GosA0M68DEbKlXMqJ7FQgsK8CjQD2vxvNSqAU6PZEpi4cfcTVtfM2GVOMjHo7GKKLbXxOBqDqA==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "vue": "^3.4.37" - } - }, - "node_modules/walk-up-path": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-3.0.1.tgz", - "integrity": "sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==", - "dev": true - }, - "node_modules/watchpack": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", - "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", - "dev": true, - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dev": true, - "dependencies": { - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, - "node_modules/webpack": { - "version": "5.101.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.101.0.tgz", - "integrity": "sha512-B4t+nJqytPeuZlHuIKTbalhljIFXeNRqrUGAQgTGlfOl2lXXKXw+yZu6bicycP+PUlM44CxBjCFD6aciKFT3LQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/eslint-scope": "^3.7.7", - "@types/estree": "^1.0.8", - "@types/json-schema": "^7.0.15", - "@webassemblyjs/ast": "^1.14.1", - "@webassemblyjs/wasm-edit": "^1.14.1", - "@webassemblyjs/wasm-parser": "^1.14.1", - "acorn": "^8.15.0", - "acorn-import-phases": "^1.0.3", - "browserslist": "^4.24.0", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.2", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.11", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^4.3.2", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.11", - "watchpack": "^2.4.1", - "webpack-sources": "^3.3.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-cli": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-6.0.1.tgz", - "integrity": "sha512-MfwFQ6SfwinsUVi0rNJm7rHZ31GyTcpVE5pgVA3hwFRb7COD4TzjUUwhGWKfO50+xdc2MQPuEBBJoqIMGt3JDw==", - "dev": true, - "dependencies": { - "@discoveryjs/json-ext": "^0.6.1", - "@webpack-cli/configtest": "^3.0.1", - "@webpack-cli/info": "^3.0.1", - "@webpack-cli/serve": "^3.0.1", - "colorette": "^2.0.14", - "commander": "^12.1.0", - "cross-spawn": "^7.0.3", - "envinfo": "^7.14.0", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^3.1.1", - "rechoir": "^0.8.0", - "webpack-merge": "^6.0.1" - }, - "bin": { - "webpack-cli": "bin/cli.js" - }, - "engines": { - "node": ">=18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.82.0" - }, - "peerDependenciesMeta": { - "webpack-bundle-analyzer": { - "optional": true - }, - "webpack-dev-server": { - "optional": true - } - } - }, - "node_modules/webpack-cli/node_modules/envinfo": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.14.0.tgz", - "integrity": "sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==", - "dev": true, - "bin": { - "envinfo": "dist/cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/webpack-cli/node_modules/interpret": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", - "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", - "dev": true, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack-cli/node_modules/rechoir": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", - "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", - "dev": true, - "dependencies": { - "resolve": "^1.20.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/webpack-merge": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", - "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", - "dev": true, - "dependencies": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.1" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/webpack-sources": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", - "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack-virtual-modules": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", - "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", - "dev": true - }, - "node_modules/webpack/node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true, - "license": "MIT" - }, - "node_modules/webpack/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/webpack/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/webpack/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", - "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", - "dev": true, - "dependencies": { - "is-bigint": "^1.1.0", - "is-boolean-object": "^1.2.1", - "is-number-object": "^1.1.1", - "is-string": "^1.1.1", - "is-symbol": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", - "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", - "dev": true, - "dependencies": { - "call-bound": "^1.0.2", - "function.prototype.name": "^1.1.6", - "has-tostringtag": "^1.0.2", - "is-async-function": "^2.0.0", - "is-date-object": "^1.1.0", - "is-finalizationregistry": "^1.1.0", - "is-generator-function": "^1.0.10", - "is-regex": "^1.2.1", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.1.0", - "which-collection": "^1.0.2", - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "node_modules/which-collection": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", - "dev": true, - "dependencies": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.19", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", - "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "for-each": "^0.3.5", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dev": true, - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/widest-line": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", - "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", - "dev": true, - "dependencies": { - "string-width": "^5.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/widest-line/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/widest-line/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/widest-line/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/widest-line/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/wildcard": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", - "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", - "dev": true - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true - }, - "node_modules/workbox-background-sync": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-7.3.0.tgz", - "integrity": "sha512-PCSk3eK7Mxeuyatb22pcSx9dlgWNv3+M8PqPaYDokks8Y5/FX4soaOqj3yhAZr5k6Q5JWTOMYgaJBpbw11G9Eg==", - "dev": true, - "dependencies": { - "idb": "^7.0.1", - "workbox-core": "7.3.0" - } - }, - "node_modules/workbox-broadcast-update": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-7.3.0.tgz", - "integrity": "sha512-T9/F5VEdJVhwmrIAE+E/kq5at2OY6+OXXgOWQevnubal6sO92Gjo24v6dCVwQiclAF5NS3hlmsifRrpQzZCdUA==", - "dev": true, - "dependencies": { - "workbox-core": "7.3.0" - } - }, - "node_modules/workbox-build": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-7.3.0.tgz", - "integrity": "sha512-JGL6vZTPlxnlqZRhR/K/msqg3wKP+m0wfEUVosK7gsYzSgeIxvZLi1ViJJzVL7CEeI8r7rGFV973RiEqkP3lWQ==", + "node_modules/vitepress/node_modules/oniguruma-to-es": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-3.1.1.tgz", + "integrity": "sha512-bUH8SDvPkH3ho3dvwJwfonjlQ4R80vjyvrU8YpxuROddv55vAEJrTuCuCVUhhsHbtlD9tGGbaNApGQckXhS8iQ==", "dev": true, - "dependencies": { - "@apideck/better-ajv-errors": "^0.3.1", - "@babel/core": "^7.24.4", - "@babel/preset-env": "^7.11.0", - "@babel/runtime": "^7.11.2", - "@rollup/plugin-babel": "^5.2.0", - "@rollup/plugin-node-resolve": "^15.2.3", - "@rollup/plugin-replace": "^2.4.1", - "@rollup/plugin-terser": "^0.4.3", - "@surma/rollup-plugin-off-main-thread": "^2.2.3", - "ajv": "^8.6.0", - "common-tags": "^1.8.0", - "fast-json-stable-stringify": "^2.1.0", - "fs-extra": "^9.0.1", - "glob": "^7.1.6", - "lodash": "^4.17.20", - "pretty-bytes": "^5.3.0", - "rollup": "^2.43.1", - "source-map": "^0.8.0-beta.0", - "stringify-object": "^3.3.0", - "strip-comments": "^2.0.1", - "tempy": "^0.6.0", - "upath": "^1.2.0", - "workbox-background-sync": "7.3.0", - "workbox-broadcast-update": "7.3.0", - "workbox-cacheable-response": "7.3.0", - "workbox-core": "7.3.0", - "workbox-expiration": "7.3.0", - "workbox-google-analytics": "7.3.0", - "workbox-navigation-preload": "7.3.0", - "workbox-precaching": "7.3.0", - "workbox-range-requests": "7.3.0", - "workbox-recipes": "7.3.0", - "workbox-routing": "7.3.0", - "workbox-strategies": "7.3.0", - "workbox-streams": "7.3.0", - "workbox-sw": "7.3.0", - "workbox-window": "7.3.0" - }, - "engines": { - "node": ">=16.0.0" + "license": "MIT", + "dependencies": { + "emoji-regex-xs": "^1.0.0", + "regex": "^6.0.1", + "regex-recursion": "^6.0.2" } }, - "node_modules/workbox-build/node_modules/@apideck/better-ajv-errors": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz", - "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==", + "node_modules/vitepress/node_modules/shiki": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-2.5.0.tgz", + "integrity": "sha512-mI//trrsaiCIPsja5CNfsyNOqgAZUb6VpJA+340toL42UpzQlXpwRV9nch69X6gaUxrr9kaOOa6e3y3uAkGFxQ==", "dev": true, + "license": "MIT", "dependencies": { - "json-schema": "^0.4.0", - "jsonpointer": "^5.0.0", - "leven": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "ajv": ">=8" + "@shikijs/core": "2.5.0", + "@shikijs/engine-javascript": "2.5.0", + "@shikijs/engine-oniguruma": "2.5.0", + "@shikijs/langs": "2.5.0", + "@shikijs/themes": "2.5.0", + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" } }, - "node_modules/workbox-build/node_modules/@rollup/plugin-babel": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", - "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", + "node_modules/vitest": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz", + "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.10.4", - "@rollup/pluginutils": "^3.1.0" + "@types/chai": "^5.2.2", + "@vitest/expect": "3.2.4", + "@vitest/mocker": "3.2.4", + "@vitest/pretty-format": "^3.2.4", + "@vitest/runner": "3.2.4", + "@vitest/snapshot": "3.2.4", + "@vitest/spy": "3.2.4", + "@vitest/utils": "3.2.4", + "chai": "^5.2.0", + "debug": "^4.4.1", + "expect-type": "^1.2.1", + "magic-string": "^0.30.17", + "pathe": "^2.0.3", + "picomatch": "^4.0.2", + "std-env": "^3.9.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.2", + "tinyglobby": "^0.2.14", + "tinypool": "^1.1.1", + "tinyrainbow": "^2.0.0", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", + "vite-node": "3.2.4", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" }, "engines": { - "node": ">= 10.0.0" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "@babel/core": "^7.0.0", - "@types/babel__core": "^7.1.9", - "rollup": "^1.20.0||^2.0.0" + "@edge-runtime/vm": "*", + "@types/debug": "^4.1.12", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "@vitest/browser": "3.2.4", + "@vitest/ui": "3.2.4", + "happy-dom": "*", + "jsdom": "*" }, "peerDependenciesMeta": { - "@types/babel__core": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/debug": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { "optional": true } } }, - "node_modules/workbox-build/node_modules/@rollup/plugin-replace": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", - "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^3.1.0", - "magic-string": "^0.25.7" - }, - "peerDependencies": { - "rollup": "^1.20.0 || ^2.0.0" - } - }, - "node_modules/workbox-build/node_modules/@rollup/pluginutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", - "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "node_modules/vitest/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, - "dependencies": { - "@types/estree": "0.0.39", - "estree-walker": "^1.0.1", - "picomatch": "^2.2.2" - }, + "license": "MIT", "engines": { - "node": ">= 8.0.0" + "node": ">=12.0.0" }, "peerDependencies": { - "rollup": "^1.20.0||^2.0.0" + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } } }, - "node_modules/workbox-build/node_modules/@types/estree": { - "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", - "dev": true - }, - "node_modules/workbox-build/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "node_modules/vitest/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" + "license": "MIT", + "engines": { + "node": ">=12" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/workbox-build/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/workbox-build/node_modules/estree-walker": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", - "dev": true - }, - "node_modules/workbox-build/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "node_modules/vitest/node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", "dev": true, + "license": "MIT", "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "fdir": "^6.5.0", + "picomatch": "^4.0.3" }, "engines": { - "node": ">=10" + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/workbox-build/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, + "node_modules/vue": { + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.22.tgz", + "integrity": "sha512-toaZjQ3a/G/mYaLSbV+QsQhIdMo9x5rrqIpYRObsJ6T/J+RyCSFwN2LHNVH9v8uIcljDNa3QzPVdv3Y6b9hAJQ==", + "license": "MIT", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "@vue/compiler-dom": "3.5.22", + "@vue/compiler-sfc": "3.5.22", + "@vue/runtime-dom": "3.5.22", + "@vue/server-renderer": "3.5.22", + "@vue/shared": "3.5.22" }, - "engines": { - "node": "*" + "peerDependencies": { + "typescript": "*" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/workbox-build/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "node_modules/vue-flow-layout": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/vue-flow-layout/-/vue-flow-layout-0.2.0.tgz", + "integrity": "sha512-zKgsWWkXq0xrus7H4Mc+uFs1ESrmdTXlO0YNbR6wMdPaFvosL3fMB8N7uTV308UhGy9UvTrGhIY7mVz9eN+L0Q==", + "dev": true, + "license": "MIT" }, - "node_modules/workbox-build/node_modules/magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "node_modules/walk-up-path": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-3.0.1.tgz", + "integrity": "sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==", + "dev": true, + "license": "ISC" + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", "dev": true, + "license": "MIT", "dependencies": { - "sourcemap-codec": "^1.4.8" + "minimalistic-assert": "^1.0.0" } }, - "node_modules/workbox-build/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" + "defaults": "^1.0.3" } }, - "node_modules/workbox-build/node_modules/pretty-bytes": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", - "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "license": "BSD-2-Clause" }, - "node_modules/workbox-build/node_modules/rollup": { - "version": "2.79.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", - "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", + "node_modules/webpack-virtual-modules": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", + "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", "dev": true, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=10.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } + "license": "MIT" }, - "node_modules/workbox-build/node_modules/source-map": { - "version": "0.8.0-beta.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", - "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, + "license": "ISC", "dependencies": { - "whatwg-url": "^7.0.0" + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" }, "engines": { "node": ">= 8" } }, - "node_modules/workbox-build/node_modules/tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", "dev": true, + "license": "MIT", "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/workbox-build/node_modules/upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true, + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, "engines": { - "node": ">=4", - "yarn": "*" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/workbox-build/node_modules/webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "dev": true - }, - "node_modules/workbox-build/node_modules/whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", "dev": true, + "license": "MIT", "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/workbox-cacheable-response": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-7.3.0.tgz", - "integrity": "sha512-eAFERIg6J2LuyELhLlmeRcJFa5e16Mj8kL2yCDbhWE+HUun9skRQrGIFVUagqWj4DMaaPSMWfAolM7XZZxNmxA==", + "node_modules/which-builtin-type/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "dev": true, - "dependencies": { - "workbox-core": "7.3.0" - } - }, - "node_modules/workbox-core": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-7.3.0.tgz", - "integrity": "sha512-Z+mYrErfh4t3zi7NVTvOuACB0A/jA3bgxUN3PwtAVHvfEsZxV9Iju580VEETug3zYJRc0Dmii/aixI/Uxj8fmw==", - "dev": true + "license": "MIT" }, - "node_modules/workbox-expiration": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-7.3.0.tgz", - "integrity": "sha512-lpnSSLp2BM+K6bgFCWc5bS1LR5pAwDWbcKt1iL87/eTSJRdLdAwGQznZE+1czLgn/X05YChsrEegTNxjM067vQ==", + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", "dev": true, + "license": "MIT", "dependencies": { - "idb": "^7.0.1", - "workbox-core": "7.3.0" + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/workbox-google-analytics": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-7.3.0.tgz", - "integrity": "sha512-ii/tSfFdhjLHZ2BrYgFNTrb/yk04pw2hasgbM70jpZfLk0vdJAXgaiMAWsoE+wfJDNWoZmBYY0hMVI0v5wWDbg==", + "node_modules/which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", "dev": true, + "license": "MIT", "dependencies": { - "workbox-background-sync": "7.3.0", - "workbox-core": "7.3.0", - "workbox-routing": "7.3.0", - "workbox-strategies": "7.3.0" + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/workbox-navigation-preload": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-7.3.0.tgz", - "integrity": "sha512-fTJzogmFaTv4bShZ6aA7Bfj4Cewaq5rp30qcxl2iYM45YD79rKIhvzNHiFj1P+u5ZZldroqhASXwwoyusnr2cg==", + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", "dev": true, + "license": "MIT", "dependencies": { - "workbox-core": "7.3.0" + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" } }, - "node_modules/workbox-precaching": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-7.3.0.tgz", - "integrity": "sha512-ckp/3t0msgXclVAYaNndAGeAoWQUv7Rwc4fdhWL69CCAb2UHo3Cef0KIUctqfQj1p8h6aGyz3w8Cy3Ihq9OmIw==", + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", "dev": true, + "license": "ISC", "dependencies": { - "workbox-core": "7.3.0", - "workbox-routing": "7.3.0", - "workbox-strategies": "7.3.0" + "string-width": "^1.0.2 || 2 || 3 || 4" } }, - "node_modules/workbox-range-requests": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-7.3.0.tgz", - "integrity": "sha512-EyFmM1KpDzzAouNF3+EWa15yDEenwxoeXu9bgxOEYnFfCxns7eAxA9WSSaVd8kujFFt3eIbShNqa4hLQNFvmVQ==", + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, - "dependencies": { - "workbox-core": "7.3.0" + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/workbox-recipes": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-7.3.0.tgz", - "integrity": "sha512-BJro/MpuW35I/zjZQBcoxsctgeB+kyb2JAP5EB3EYzePg8wDGoQuUdyYQS+CheTb+GhqJeWmVs3QxLI8EBP1sg==", + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", "dev": true, - "dependencies": { - "workbox-cacheable-response": "7.3.0", - "workbox-core": "7.3.0", - "workbox-expiration": "7.3.0", - "workbox-precaching": "7.3.0", - "workbox-routing": "7.3.0", - "workbox-strategies": "7.3.0" - } + "license": "MIT" }, - "node_modules/workbox-routing": { + "node_modules/workbox-background-sync": { "version": "7.3.0", - "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-7.3.0.tgz", - "integrity": "sha512-ZUlysUVn5ZUzMOmQN3bqu+gK98vNfgX/gSTZ127izJg/pMMy4LryAthnYtjuqcjkN4HEAx1mdgxNiKJMZQM76A==", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-7.3.0.tgz", + "integrity": "sha512-PCSk3eK7Mxeuyatb22pcSx9dlgWNv3+M8PqPaYDokks8Y5/FX4soaOqj3yhAZr5k6Q5JWTOMYgaJBpbw11G9Eg==", "dev": true, + "license": "MIT", "dependencies": { + "idb": "^7.0.1", "workbox-core": "7.3.0" } }, - "node_modules/workbox-strategies": { + "node_modules/workbox-broadcast-update": { "version": "7.3.0", - "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-7.3.0.tgz", - "integrity": "sha512-tmZydug+qzDFATwX7QiEL5Hdf7FrkhjaF9db1CbB39sDmEZJg3l9ayDvPxy8Y18C3Y66Nrr9kkN1f/RlkDgllg==", + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-7.3.0.tgz", + "integrity": "sha512-T9/F5VEdJVhwmrIAE+E/kq5at2OY6+OXXgOWQevnubal6sO92Gjo24v6dCVwQiclAF5NS3hlmsifRrpQzZCdUA==", "dev": true, + "license": "MIT", "dependencies": { "workbox-core": "7.3.0" } }, - "node_modules/workbox-streams": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-7.3.0.tgz", - "integrity": "sha512-SZnXucyg8x2Y61VGtDjKPO5EgPUG5NDn/v86WYHX+9ZqvAsGOytP0Jxp1bl663YUuMoXSAtsGLL+byHzEuMRpw==", - "dev": true, - "dependencies": { - "workbox-core": "7.3.0", - "workbox-routing": "7.3.0" - } - }, - "node_modules/workbox-sw": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-7.3.0.tgz", - "integrity": "sha512-aCUyoAZU9IZtH05mn0ACUpyHzPs0lMeJimAYkQkBsOWiqaJLgusfDCR+yllkPkFRxWpZKF8vSvgHYeG7LwhlmA==", - "dev": true - }, - "node_modules/workbox-window": { + "node_modules/workbox-build": { "version": "7.3.0", - "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-7.3.0.tgz", - "integrity": "sha512-qW8PDy16OV1UBaUNGlTVcepzrlzyzNW/ZJvFQQs2j2TzGsg6IKjcpZC1RSquqQnTOafl5pCj5bGfAHlCjOOjdA==", - "dev": true, - "dependencies": { - "@types/trusted-types": "^2.0.2", - "workbox-core": "7.3.0" - } - }, - "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==", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-7.3.0.tgz", + "integrity": "sha512-JGL6vZTPlxnlqZRhR/K/msqg3wKP+m0wfEUVosK7gsYzSgeIxvZLi1ViJJzVL7CEeI8r7rGFV973RiEqkP3lWQ==", "dev": true, - "license": "Apache-2.0" - }, - "node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "@apideck/better-ajv-errors": "^0.3.1", + "@babel/core": "^7.24.4", + "@babel/preset-env": "^7.11.0", + "@babel/runtime": "^7.11.2", + "@rollup/plugin-babel": "^5.2.0", + "@rollup/plugin-node-resolve": "^15.2.3", + "@rollup/plugin-replace": "^2.4.1", + "@rollup/plugin-terser": "^0.4.3", + "@surma/rollup-plugin-off-main-thread": "^2.2.3", + "ajv": "^8.6.0", + "common-tags": "^1.8.0", + "fast-json-stable-stringify": "^2.1.0", + "fs-extra": "^9.0.1", + "glob": "^7.1.6", + "lodash": "^4.17.20", + "pretty-bytes": "^5.3.0", + "rollup": "^2.43.1", + "source-map": "^0.8.0-beta.0", + "stringify-object": "^3.3.0", + "strip-comments": "^2.0.1", + "tempy": "^0.6.0", + "upath": "^1.2.0", + "workbox-background-sync": "7.3.0", + "workbox-broadcast-update": "7.3.0", + "workbox-cacheable-response": "7.3.0", + "workbox-core": "7.3.0", + "workbox-expiration": "7.3.0", + "workbox-google-analytics": "7.3.0", + "workbox-navigation-preload": "7.3.0", + "workbox-precaching": "7.3.0", + "workbox-range-requests": "7.3.0", + "workbox-recipes": "7.3.0", + "workbox-routing": "7.3.0", + "workbox-strategies": "7.3.0", + "workbox-streams": "7.3.0", + "workbox-sw": "7.3.0", + "workbox-window": "7.3.0" }, "engines": { - "node": ">=8" + "node": ">=16.0.0" } }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "node_modules/workbox-build/node_modules/@apideck/better-ajv-errors": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz", + "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "json-schema": "^0.4.0", + "jsonpointer": "^5.0.0", + "leven": "^3.1.0" }, "engines": { "node": ">=10" }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "peerDependencies": { + "ajv": ">=8" } }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/workbox-build/node_modules/@rollup/plugin-babel": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", + "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", "dev": true, + "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "@babel/helper-module-imports": "^7.10.4", + "@rollup/pluginutils": "^3.1.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" + "node": ">= 10.0.0" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "@babel/core": "^7.0.0", + "@types/babel__core": "^7.1.9", + "rollup": "^1.20.0||^2.0.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "peerDependenciesMeta": { + "@types/babel__core": { + "optional": true + } } }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "node_modules/write-file-atomic": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", - "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "node_modules/workbox-build/node_modules/@rollup/plugin-replace": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", + "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", "dev": true, + "license": "MIT", "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^4.0.1" + "@rollup/pluginutils": "^3.1.0", + "magic-string": "^0.25.7" }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "peerDependencies": { + "rollup": "^1.20.0 || ^2.0.0" } }, - "node_modules/write-json-file": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/write-json-file/-/write-json-file-3.2.0.tgz", - "integrity": "sha512-3xZqT7Byc2uORAatYiP3DHUUAVEkNOswEWNs9H5KXiicRTvzYzYqKjYc4G7p+8pltvAw641lVByKVtMpf+4sYQ==", + "node_modules/workbox-build/node_modules/@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", "dev": true, + "license": "MIT", "dependencies": { - "detect-indent": "^5.0.0", - "graceful-fs": "^4.1.15", - "make-dir": "^2.1.0", - "pify": "^4.0.1", - "sort-keys": "^2.0.0", - "write-file-atomic": "^2.4.2" + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" }, "engines": { - "node": ">=6" - } - }, - "node_modules/write-json-file/node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" + "node": ">= 8.0.0" }, - "engines": { - "node": ">=6" + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" } }, - "node_modules/write-json-file/node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "node_modules/workbox-build/node_modules/@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", "dev": true, - "engines": { - "node": ">=6" - } + "license": "MIT" }, - "node_modules/write-json-file/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "node_modules/workbox-build/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, - "bin": { - "semver": "bin/semver" + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/write-json-file/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/write-json-file/node_modules/write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "node_modules/workbox-build/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, + "license": "MIT", "dependencies": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/write-pkg": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/write-pkg/-/write-pkg-4.0.0.tgz", - "integrity": "sha512-v2UQ+50TNf2rNHJ8NyWttfm/EJUBWMJcx6ZTYZr6Qp52uuegWw/lBkCtCbnYZEmPRNL61m+u67dAmGxo+HTULA==", + "node_modules/workbox-build/node_modules/estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "dev": true, + "license": "MIT" + }, + "node_modules/workbox-build/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, + "license": "MIT", "dependencies": { - "sort-keys": "^2.0.0", - "type-fest": "^0.4.1", - "write-json-file": "^3.2.0" + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/write-pkg/node_modules/type-fest": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.4.1.tgz", - "integrity": "sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw==", + "node_modules/workbox-build/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xdg-basedir": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", - "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", - "dev": true, "engines": { - "node": ">=12" + "node": "*" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/xmlhttprequest-ssl": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.2.tgz", - "integrity": "sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==", + "node_modules/workbox-build/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/workbox-build/node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", "dev": true, - "engines": { - "node": ">=0.4.0" + "license": "MIT", + "dependencies": { + "sourcemap-codec": "^1.4.8" } }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "node_modules/workbox-build/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, "engines": { - "node": ">=0.4" + "node": "*" } }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "node_modules/workbox-build/node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", "dev": true, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/yaml": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.1.tgz", - "integrity": "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==", + "node_modules/workbox-build/node_modules/rollup": { + "version": "2.79.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", + "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", "dev": true, + "license": "MIT", "bin": { - "yaml": "bin.mjs" + "rollup": "dist/bin/rollup" }, "engines": { - "node": ">= 14" + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "node_modules/workbox-build/node_modules/source-map": { + "version": "0.8.0-beta.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "deprecated": "The work that was done in this beta branch won't be included in future versions", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" + "whatwg-url": "^7.0.0" }, "engines": { - "node": ">=12" + "node": ">= 8" } }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "node_modules/workbox-build/node_modules/tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", "dev": true, - "engines": { - "node": ">=12" + "license": "MIT", + "dependencies": { + "punycode": "^2.1.0" } }, - "node_modules/yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "node_modules/workbox-build/node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", "dev": true, - "dependencies": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=4", + "yarn": "*" } }, - "node_modules/yargs-unparser/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "node_modules/workbox-build/node_modules/webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "license": "BSD-2-Clause" }, - "node_modules/yargs-unparser/node_modules/decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "node_modules/workbox-build/node_modules/whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "license": "MIT", + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" } }, - "node_modules/yargs-unparser/node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "node_modules/workbox-cacheable-response": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-7.3.0.tgz", + "integrity": "sha512-eAFERIg6J2LuyELhLlmeRcJFa5e16Mj8kL2yCDbhWE+HUun9skRQrGIFVUagqWj4DMaaPSMWfAolM7XZZxNmxA==", "dev": true, - "engines": { - "node": ">=8" + "license": "MIT", + "dependencies": { + "workbox-core": "7.3.0" } }, - "node_modules/yauzl": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-3.2.0.tgz", - "integrity": "sha512-Ow9nuGZE+qp1u4JIPvg+uCiUr7xGQWdff7JQSk5VGYTAZMDe2q8lxJ10ygv10qmSj031Ty/6FNJpLO4o1Sgc+w==", + "node_modules/workbox-core": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-7.3.0.tgz", + "integrity": "sha512-Z+mYrErfh4t3zi7NVTvOuACB0A/jA3bgxUN3PwtAVHvfEsZxV9Iju580VEETug3zYJRc0Dmii/aixI/Uxj8fmw==", + "dev": true, + "license": "MIT" + }, + "node_modules/workbox-expiration": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-7.3.0.tgz", + "integrity": "sha512-lpnSSLp2BM+K6bgFCWc5bS1LR5pAwDWbcKt1iL87/eTSJRdLdAwGQznZE+1czLgn/X05YChsrEegTNxjM067vQ==", "dev": true, + "license": "MIT", "dependencies": { - "buffer-crc32": "~0.2.3", - "pend": "~1.2.0" - }, - "engines": { - "node": ">=12" + "idb": "^7.0.1", + "workbox-core": "7.3.0" } }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "node_modules/workbox-google-analytics": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-7.3.0.tgz", + "integrity": "sha512-ii/tSfFdhjLHZ2BrYgFNTrb/yk04pw2hasgbM70jpZfLk0vdJAXgaiMAWsoE+wfJDNWoZmBYY0hMVI0v5wWDbg==", "dev": true, - "engines": { - "node": ">=6" + "license": "MIT", + "dependencies": { + "workbox-background-sync": "7.3.0", + "workbox-core": "7.3.0", + "workbox-routing": "7.3.0", + "workbox-strategies": "7.3.0" } }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "node_modules/workbox-navigation-preload": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-7.3.0.tgz", + "integrity": "sha512-fTJzogmFaTv4bShZ6aA7Bfj4Cewaq5rp30qcxl2iYM45YD79rKIhvzNHiFj1P+u5ZZldroqhASXwwoyusnr2cg==", "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "license": "MIT", + "dependencies": { + "workbox-core": "7.3.0" } }, - "node_modules/yoctocolors-cjs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", - "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/workbox-precaching": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-7.3.0.tgz", + "integrity": "sha512-ckp/3t0msgXclVAYaNndAGeAoWQUv7Rwc4fdhWL69CCAb2UHo3Cef0KIUctqfQj1p8h6aGyz3w8Cy3Ihq9OmIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "workbox-core": "7.3.0", + "workbox-routing": "7.3.0", + "workbox-strategies": "7.3.0" } }, - "node_modules/zod": { - "version": "3.24.3", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.3.tgz", - "integrity": "sha512-HhY1oqzWCQWuUqvBFnsyrtZRhyPeR7SUGv+C4+MsisMuVfSPx8HpwWqH8tRahSlt6M3PiFAcoeFhZAqIXTxoSg==", - "funding": { - "url": "https://github.com/sponsors/colinhacks" + "node_modules/workbox-range-requests": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-7.3.0.tgz", + "integrity": "sha512-EyFmM1KpDzzAouNF3+EWa15yDEenwxoeXu9bgxOEYnFfCxns7eAxA9WSSaVd8kujFFt3eIbShNqa4hLQNFvmVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "workbox-core": "7.3.0" } }, - "node_modules/zwitch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", - "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "node_modules/workbox-recipes": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-7.3.0.tgz", + "integrity": "sha512-BJro/MpuW35I/zjZQBcoxsctgeB+kyb2JAP5EB3EYzePg8wDGoQuUdyYQS+CheTb+GhqJeWmVs3QxLI8EBP1sg==", + "dev": true, + "license": "MIT", + "dependencies": { + "workbox-cacheable-response": "7.3.0", + "workbox-core": "7.3.0", + "workbox-expiration": "7.3.0", + "workbox-precaching": "7.3.0", + "workbox-routing": "7.3.0", + "workbox-strategies": "7.3.0" } }, - "packages/adapter-commons": { - "name": "@feathersjs/adapter-commons", - "version": "5.0.34", + "node_modules/workbox-routing": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-7.3.0.tgz", + "integrity": "sha512-ZUlysUVn5ZUzMOmQN3bqu+gK98vNfgX/gSTZ127izJg/pMMy4LryAthnYtjuqcjkN4HEAx1mdgxNiKJMZQM76A==", + "dev": true, "license": "MIT", "dependencies": { - "@feathersjs/commons": "^5.0.34", - "@feathersjs/errors": "^5.0.34", - "@feathersjs/feathers": "^5.0.34" - }, - "devDependencies": { - "@types/mocha": "^10.0.10", - "@types/mongodb": "^4.0.6", - "@types/node": "^24.1.0", - "mocha": "^11.7.1", - "mongodb": "^6.18.0", - "shx": "^0.4.0", - "ts-node": "^10.9.2", - "typescript": "^5.9.2" - }, - "engines": { - "node": ">= 12" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/feathers" + "workbox-core": "7.3.0" + } + }, + "node_modules/workbox-strategies": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-7.3.0.tgz", + "integrity": "sha512-tmZydug+qzDFATwX7QiEL5Hdf7FrkhjaF9db1CbB39sDmEZJg3l9ayDvPxy8Y18C3Y66Nrr9kkN1f/RlkDgllg==", + "dev": true, + "license": "MIT", + "dependencies": { + "workbox-core": "7.3.0" } }, - "packages/adapter-tests": { - "name": "@feathersjs/adapter-tests", - "version": "5.0.34", + "node_modules/workbox-streams": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-7.3.0.tgz", + "integrity": "sha512-SZnXucyg8x2Y61VGtDjKPO5EgPUG5NDn/v86WYHX+9ZqvAsGOytP0Jxp1bl663YUuMoXSAtsGLL+byHzEuMRpw==", + "dev": true, "license": "MIT", - "devDependencies": { - "@types/mocha": "^10.0.10", - "@types/node": "^24.1.0", - "mocha": "^11.7.1", - "shx": "^0.4.0", - "ts-node": "^10.9.2", - "typescript": "^5.9.2" - }, - "engines": { - "node": ">= 12" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/feathers" + "dependencies": { + "workbox-core": "7.3.0", + "workbox-routing": "7.3.0" } }, - "packages/authentication": { - "name": "@feathersjs/authentication", - "version": "5.0.34", + "node_modules/workbox-sw": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-7.3.0.tgz", + "integrity": "sha512-aCUyoAZU9IZtH05mn0ACUpyHzPs0lMeJimAYkQkBsOWiqaJLgusfDCR+yllkPkFRxWpZKF8vSvgHYeG7LwhlmA==", + "dev": true, + "license": "MIT" + }, + "node_modules/workbox-window": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-7.3.0.tgz", + "integrity": "sha512-qW8PDy16OV1UBaUNGlTVcepzrlzyzNW/ZJvFQQs2j2TzGsg6IKjcpZC1RSquqQnTOafl5pCj5bGfAHlCjOOjdA==", + "dev": true, "license": "MIT", "dependencies": { - "@feathersjs/commons": "^5.0.34", - "@feathersjs/errors": "^5.0.34", - "@feathersjs/feathers": "^5.0.34", - "@feathersjs/hooks": "^0.9.0", - "@feathersjs/schema": "^5.0.34", - "@feathersjs/transport-commons": "^5.0.34", - "@types/jsonwebtoken": "^9.0.10", - "jsonwebtoken": "^9.0.2", - "lodash": "^4.17.21", - "long-timeout": "^0.1.1", - "uuid": "^11.1.0" - }, - "devDependencies": { - "@feathersjs/memory": "^5.0.34", - "@types/lodash": "^4.17.20", - "@types/mocha": "^10.0.10", - "@types/node": "^24.1.0", - "@types/uuid": "^10.0.0", - "mocha": "^11.7.1", - "shx": "^0.4.0", - "ts-node": "^10.9.2", - "typescript": "^5.9.2" - }, - "engines": { - "node": ">= 12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/daffl" + "@types/trusted-types": "^2.0.2", + "workbox-core": "7.3.0" } }, - "packages/authentication-client": { - "name": "@feathersjs/authentication-client", - "version": "5.0.34", + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "license": "MIT", "dependencies": { - "@feathersjs/authentication": "^5.0.34", - "@feathersjs/commons": "^5.0.34", - "@feathersjs/errors": "^5.0.34", - "@feathersjs/feathers": "^5.0.34" - }, - "devDependencies": { - "@feathersjs/authentication-local": "^5.0.34", - "@feathersjs/express": "^5.0.34", - "@feathersjs/memory": "^5.0.34", - "@feathersjs/rest-client": "^5.0.34", - "@feathersjs/socketio": "^5.0.34", - "@feathersjs/socketio-client": "^5.0.34", - "@types/mocha": "^10.0.10", - "@types/node": "^24.1.0", - "axios": "^1.11.0", - "mocha": "^11.7.1", - "shx": "^0.4.0", - "ts-node": "^10.9.2", - "typescript": "^5.9.2" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">= 12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/daffl" + "node": ">=8" } }, - "packages/authentication-local": { - "name": "@feathersjs/authentication-local", - "version": "5.0.34", + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, "license": "MIT", "dependencies": { - "@feathersjs/authentication": "^5.0.34", - "@feathersjs/commons": "^5.0.34", - "@feathersjs/errors": "^5.0.34", - "@feathersjs/feathers": "^5.0.34", - "bcryptjs": "^3.0.2", - "lodash": "^4.17.21" - }, - "devDependencies": { - "@feathersjs/memory": "^5.0.34", - "@feathersjs/schema": "^5.0.34", - "@types/bcryptjs": "^2.4.6", - "@types/lodash": "^4.17.20", - "@types/mocha": "^10.0.10", - "@types/node": "^24.1.0", - "mocha": "^11.7.1", - "shx": "^0.4.0", - "ts-node": "^10.9.2", - "typescript": "^5.9.2" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">= 12" + "node": ">=10" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/daffl" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "packages/authentication-oauth": { - "name": "@feathersjs/authentication-oauth", - "version": "5.0.34", + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "license": "MIT", "dependencies": { - "@feathersjs/authentication": "^5.0.34", - "@feathersjs/commons": "^5.0.34", - "@feathersjs/errors": "^5.0.34", - "@feathersjs/express": "^5.0.34", - "@feathersjs/feathers": "^5.0.34", - "@feathersjs/koa": "^5.0.34", - "@feathersjs/schema": "^5.0.34", - "cookie-session": "^2.1.1", - "grant": "^5.4.24", - "koa-session": "^7.0.2", - "qs": "^6.14.0" - }, - "devDependencies": { - "@feathersjs/memory": "^5.0.34", - "@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.1.0", - "@types/tough-cookie": "^4.0.5", - "axios": "^1.11.0", - "mocha": "^11.7.1", - "shx": "^0.4.0", - "tough-cookie": "^5.1.2", - "ts-node": "^10.9.2", - "typescript": "^5.9.2" + "color-convert": "^2.0.1" }, "engines": { - "node": ">= 12" + "node": ">=8" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/daffl" - } - }, - "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==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/esm/bin/uuid" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "packages/cli": { - "name": "@feathersjs/cli", - "version": "5.0.34", + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { - "@feathersjs/generators": "^5.0.34", - "chalk": "^5.4.1", - "commander": "^13.1.0" - }, - "bin": { - "feathers": "bin/feathers.js" - }, - "devDependencies": { - "@feathersjs/adapter-commons": "^5.0.34", - "@feathersjs/authentication": "^5.0.34", - "@feathersjs/authentication-client": "^5.0.34", - "@feathersjs/authentication-local": "^5.0.34", - "@feathersjs/authentication-oauth": "^5.0.34", - "@feathersjs/configuration": "^5.0.34", - "@feathersjs/errors": "^5.0.34", - "@feathersjs/express": "^5.0.34", - "@feathersjs/feathers": "^5.0.34", - "@feathersjs/knex": "^5.0.34", - "@feathersjs/koa": "^5.0.34", - "@feathersjs/mongodb": "^5.0.34", - "@feathersjs/rest-client": "^5.0.34", - "@feathersjs/schema": "^5.0.34", - "@feathersjs/socketio": "^5.0.34", - "@feathersjs/transport-commons": "^5.0.34", - "@feathersjs/typebox": "^5.0.34", - "@types/mocha": "^10.0.10", - "@types/node": "^24.1.0", - "@types/prettier": "^2.7.3", - "axios": "^1.11.0", - "mocha": "^11.7.1", - "shx": "^0.4.0", - "ts-node": "^10.9.2", - "type-fest": "^4.41.0", - "typescript": "^5.9.2" + "color-convert": "^2.0.1" }, "engines": { - "node": ">= 14" + "node": ">=8" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/daffl" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "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==", - "engines": { - "node": ">=18" - } + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" }, - "packages/client": { - "name": "@feathersjs/client", - "version": "5.0.34", - "license": "MIT", + "node_modules/write-file-atomic": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "dev": true, + "license": "ISC", "dependencies": { - "@feathersjs/authentication-client": "^5.0.34", - "@feathersjs/errors": "^5.0.34", - "@feathersjs/feathers": "^5.0.34", - "@feathersjs/rest-client": "^5.0.34", - "@feathersjs/socketio-client": "^5.0.34" - }, - "devDependencies": { - "@babel/core": "^7.28.0", - "@babel/preset-env": "^7.28.0", - "@feathersjs/express": "^5.0.34", - "@feathersjs/memory": "^5.0.34", - "@feathersjs/socketio": "^5.0.34", - "@feathersjs/tests": "^5.0.34", - "babel-loader": "^10.0.0", - "mocha": "^11.7.1", - "node-fetch": "^2.6.1", - "shx": "^0.4.0", - "socket.io-client": "^4.8.1", - "superagent": "^10.2.3", - "ts-loader": "^9.5.2", - "typescript": "^5.9.2", - "webpack": "^5.101.0", - "webpack-cli": "^6.0.1", - "webpack-merge": "^6.0.1" + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" }, "engines": { - "node": ">= 12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/daffl" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "packages/commons": { - "name": "@feathersjs/commons", - "version": "5.0.34", - "license": "MIT", - "devDependencies": { - "@types/mocha": "^10.0.10", - "@types/node": "^24.1.0", - "mocha": "^11.7.1", - "shx": "^0.4.0", - "ts-node": "^10.9.2", - "typescript": "^5.9.2" - }, + "node_modules/write-file-atomic/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", "engines": { - "node": ">= 12" + "node": ">=14" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/daffl" + "url": "https://github.com/sponsors/isaacs" } }, - "packages/configuration": { - "name": "@feathersjs/configuration", - "version": "5.0.34", + "node_modules/write-json-file": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/write-json-file/-/write-json-file-3.2.0.tgz", + "integrity": "sha512-3xZqT7Byc2uORAatYiP3DHUUAVEkNOswEWNs9H5KXiicRTvzYzYqKjYc4G7p+8pltvAw641lVByKVtMpf+4sYQ==", + "dev": true, "license": "MIT", "dependencies": { - "@feathersjs/commons": "^5.0.34", - "@feathersjs/feathers": "^5.0.34", - "@feathersjs/schema": "^5.0.34", - "@types/config": "^3.3.5", - "config": "^4.1.0" - }, - "devDependencies": { - "@types/mocha": "^10.0.10", - "@types/node": "^24.1.0", - "mocha": "^11.7.1", - "shx": "^0.4.0", - "ts-node": "^10.9.2", - "typescript": "^5.9.2" + "detect-indent": "^5.0.0", + "graceful-fs": "^4.1.15", + "make-dir": "^2.1.0", + "pify": "^4.0.1", + "sort-keys": "^2.0.0", + "write-file-atomic": "^2.4.2" }, "engines": { - "node": ">= 12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/daffl" + "node": ">=6" } }, - "packages/create-feathers": { - "version": "5.0.34", + "node_modules/write-json-file/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, "license": "MIT", "dependencies": { - "@feathersjs/cli": "^5.0.34" - }, - "bin": { - "create-feathers": "bin/create-feathers.js" + "pify": "^4.0.1", + "semver": "^5.6.0" }, "engines": { - "node": ">= 18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/daffl" + "node": ">=6" } }, - "packages/errors": { - "name": "@feathersjs/errors", - "version": "5.0.34", + "node_modules/write-json-file/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, "license": "MIT", - "devDependencies": { - "@feathersjs/feathers": "^5.0.34", - "@types/mocha": "^10.0.10", - "@types/node": "^24.1.0", - "mocha": "^11.7.1", - "shx": "^0.4.0", - "ts-node": "^10.9.2", - "typescript": "^5.9.2" - }, "engines": { - "node": ">= 12" + "node": ">=6" } }, - "packages/express": { - "name": "@feathersjs/express", - "version": "5.0.34", - "license": "MIT", - "dependencies": { - "@feathersjs/authentication": "^5.0.34", - "@feathersjs/commons": "^5.0.34", - "@feathersjs/errors": "^5.0.34", - "@feathersjs/feathers": "^5.0.34", - "@feathersjs/transport-commons": "^5.0.34", - "@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" - }, - "devDependencies": { - "@feathersjs/authentication-local": "^5.0.34", - "@feathersjs/tests": "^5.0.34", - "@types/lodash": "^4.17.20", - "@types/mocha": "^10.0.10", - "@types/node": "^24.1.0", - "axios": "^1.11.0", - "lodash": "^4.17.21", - "mocha": "^11.7.1", - "shx": "^0.4.0", - "ts-node": "^10.9.2", - "typescript": "^5.9.2" - }, - "engines": { - "node": ">= 12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/daffl" + "node_modules/write-json-file/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" } }, - "packages/feathers": { - "name": "@feathersjs/feathers", - "version": "5.0.34", - "license": "MIT", + "node_modules/write-json-file/node_modules/write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "dev": true, + "license": "ISC", "dependencies": { - "@feathersjs/commons": "^5.0.34", - "@feathersjs/hooks": "^0.9.0", - "events": "^3.3.0" - }, - "devDependencies": { - "@types/mocha": "^10.0.10", - "@types/node": "^24.1.0", - "mocha": "^11.7.1", - "shx": "^0.4.0", - "ts-node": "^10.9.2", - "typescript": "^5.9.2" - }, - "engines": { - "node": ">= 12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/daffl" + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" } }, - "packages/generators": { - "name": "@feathersjs/generators", - "version": "5.0.34", + "node_modules/write-pkg": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/write-pkg/-/write-pkg-4.0.0.tgz", + "integrity": "sha512-v2UQ+50TNf2rNHJ8NyWttfm/EJUBWMJcx6ZTYZr6Qp52uuegWw/lBkCtCbnYZEmPRNL61m+u67dAmGxo+HTULA==", + "dev": true, "license": "MIT", "dependencies": { - "@featherscloud/pinion": "^0.5.5", - "chalk": "^5.4.1", - "lodash": "^4.17.21", - "prettier": "^3.6.2", - "typescript": "^5.9.2" - }, - "devDependencies": { - "@feathersjs/adapter-commons": "^5.0.34", - "@feathersjs/authentication": "^5.0.34", - "@feathersjs/authentication-client": "^5.0.34", - "@feathersjs/authentication-local": "^5.0.34", - "@feathersjs/authentication-oauth": "^5.0.34", - "@feathersjs/configuration": "^5.0.34", - "@feathersjs/errors": "^5.0.34", - "@feathersjs/express": "^5.0.34", - "@feathersjs/feathers": "^5.0.34", - "@feathersjs/knex": "^5.0.34", - "@feathersjs/koa": "^5.0.34", - "@feathersjs/mongodb": "^5.0.34", - "@feathersjs/rest-client": "^5.0.34", - "@feathersjs/schema": "^5.0.34", - "@feathersjs/socketio": "^5.0.34", - "@feathersjs/transport-commons": "^5.0.34", - "@feathersjs/typebox": "^5.0.34", - "@types/mocha": "^10.0.10", - "@types/node": "^24.1.0", - "@types/prettier": "^2.7.3", - "axios": "^1.11.0", - "knex": "^3.1.0", - "mocha": "^11.7.1", - "mongodb": "^6.18.0", - "mssql": "^11.0.1", - "mysql": "^2.18.1", - "pg": "^8.16.3", - "shx": "^0.4.0", - "sqlite3": "^5.1.7", - "tsx": "^4.20.3", - "type-fest": "^4.41.0", - "typescript": "^5.9.2" + "sort-keys": "^2.0.0", + "type-fest": "^0.4.1", + "write-json-file": "^3.2.0" }, "engines": { - "node": ">= 16" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/daffl" + "node": ">=8" } }, - "packages/knex": { - "name": "@feathersjs/knex", - "version": "5.0.34", - "license": "MIT", - "dependencies": { - "@feathersjs/adapter-commons": "^5.0.34", - "@feathersjs/commons": "^5.0.34", - "@feathersjs/errors": "^5.0.34", - "@feathersjs/feathers": "^5.0.34" - }, - "devDependencies": { - "@feathersjs/adapter-tests": "^5.0.34", - "@feathersjs/schema": "^5.0.34", - "@types/mocha": "^10.0.10", - "@types/node": "^24.1.0", - "knex": "^3.1.0", - "mocha": "^11.7.1", - "pg": "^8.16.3", - "shx": "^0.4.0", - "sqlite3": "^5.1.7", - "typescript": "^5.9.2" - }, - "engines": { - "node": ">= 14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/daffl" - }, - "peerDependencies": { - "knex": ">=3.1.0" - } - }, - "packages/koa": { - "name": "@feathersjs/koa", - "version": "5.0.34", - "license": "MIT", - "dependencies": { - "@feathersjs/authentication": "^5.0.34", - "@feathersjs/commons": "^5.0.34", - "@feathersjs/errors": "^5.0.34", - "@feathersjs/feathers": "^5.0.34", - "@feathersjs/transport-commons": "^5.0.34", - "@koa/cors": "^5.0.0", - "@types/koa": "^2.15.0", - "@types/koa__cors": "^5.0.0", - "@types/koa-qs": "^2.0.3", - "@types/koa-static": "^4.0.4", - "koa": "^3.0.1", - "koa-body": "^6.0.1", - "koa-compose": "^4.1.0", - "koa-qs": "^3.0.0", - "koa-static": "^5.0.0" - }, - "devDependencies": { - "@feathersjs/authentication-local": "^5.0.34", - "@feathersjs/memory": "^5.0.34", - "@feathersjs/tests": "^5.0.34", - "@types/koa-compose": "^3.2.8", - "@types/mocha": "^10.0.10", - "@types/node": "^24.1.0", - "axios": "^1.11.0", - "mocha": "^11.7.1", - "shx": "^0.4.0", - "ts-node": "^10.9.2", - "typescript": "^5.9.2" - }, + "node_modules/write-pkg/node_modules/type-fest": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.4.1.tgz", + "integrity": "sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw==", + "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">= 14" + "node": ">=6" } }, - "packages/memory": { - "name": "@feathersjs/memory", - "version": "5.0.34", + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, "license": "MIT", - "dependencies": { - "@feathersjs/adapter-commons": "^5.0.34", - "@feathersjs/commons": "^5.0.34", - "@feathersjs/errors": "^5.0.34", - "sift": "^17.1.3" - }, - "devDependencies": { - "@feathersjs/adapter-tests": "^5.0.34", - "@feathersjs/feathers": "^5.0.34", - "@types/mocha": "^10.0.10", - "@types/node": "^24.1.0", - "mocha": "^11.7.1", - "shx": "^0.4.0", - "ts-node": "^10.9.2", - "typescript": "^5.9.2" - }, "engines": { - "node": ">= 12" + "node": ">=0.4" } }, - "packages/mongodb": { - "name": "@feathersjs/mongodb", - "version": "5.0.34", - "license": "MIT", - "dependencies": { - "@feathersjs/adapter-commons": "^5.0.34", - "@feathersjs/commons": "^5.0.34", - "@feathersjs/errors": "^5.0.34", - "@feathersjs/feathers": "^5.0.34" - }, - "devDependencies": { - "@feathersjs/adapter-tests": "^5.0.34", - "@feathersjs/schema": "^5.0.34", - "@types/mocha": "^10.0.10", - "@types/node": "^24.1.0", - "mocha": "^11.7.1", - "mongodb-memory-server": "^10.1.4", - "shx": "^0.4.0", - "typescript": "^5.9.2" - }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", "engines": { - "node": ">= 14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/daffl" - }, - "peerDependencies": { - "mongodb": "^6.18.0" + "node": ">=10" } }, - "packages/rest-client": { - "name": "@feathersjs/rest-client", - "version": "5.0.34", - "license": "MIT", - "dependencies": { - "@feathersjs/commons": "^5.0.34", - "@feathersjs/errors": "^5.0.34", - "@feathersjs/feathers": "^5.0.34", - "@types/superagent": "^8.1.9", - "qs": "^6.14.0" - }, - "devDependencies": { - "@feathersjs/express": "^5.0.34", - "@feathersjs/memory": "^5.0.34", - "@feathersjs/tests": "^5.0.34", - "@types/mocha": "^10.0.10", - "@types/node": "^24.1.0", - "@types/node-fetch": "^2.6.13", - "@types/qs": "^6.14.0", - "axios": "^1.11.0", - "mocha": "^11.7.1", - "node-fetch": "^2.6.1", - "rxjs": "^7.8.2", - "shx": "^0.4.0", - "superagent": "^10.2.3", - "ts-node": "^10.9.2", - "typescript": "^5.9.2" + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", + "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" }, "engines": { - "node": ">= 12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/daffl" + "node": ">= 14.6" } }, - "packages/schema": { - "name": "@feathersjs/schema", - "version": "5.0.34", + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, "license": "MIT", "dependencies": { - "@feathersjs/adapter-commons": "^5.0.34", - "@feathersjs/commons": "^5.0.34", - "@feathersjs/errors": "^5.0.34", - "@feathersjs/feathers": "^5.0.34", - "@feathersjs/hooks": "^0.9.0", - "@types/json-schema": "^7.0.15", - "ajv": "^8.17.1", - "ajv-formats": "^3.0.1", - "json-schema-to-ts": "^3.1.1" - }, - "devDependencies": { - "@feathersjs/memory": "^5.0.34", - "@types/mocha": "^10.0.10", - "@types/node": "^24.1.0", - "ajv-formats": "^3.0.1", - "mocha": "^11.7.1", - "shx": "^0.4.0", - "typescript": "^5.9.2" + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" }, "engines": { - "node": ">= 12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/daffl" - }, - "peerDependencies": { - "typescript": ">=5.8" + "node": ">=12" } }, - "packages/schema/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" } }, - "packages/schema/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "packages/socketio": { - "name": "@feathersjs/socketio", - "version": "5.0.34", + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, "license": "MIT", - "dependencies": { - "@feathersjs/commons": "^5.0.34", - "@feathersjs/feathers": "^5.0.34", - "@feathersjs/transport-commons": "^5.0.34", - "socket.io": "^4.8.1" - }, - "devDependencies": { - "@feathersjs/express": "^5.0.34", - "@feathersjs/memory": "^5.0.34", - "@feathersjs/tests": "^5.0.34", - "@types/mocha": "^10.0.10", - "@types/node": "^24.1.0", - "lodash": "^4.17.21", - "mocha": "^11.7.1", - "shx": "^0.4.0", - "socket.io-client": "^4.8.1", - "typescript": "^5.9.2" - }, "engines": { - "node": ">= 12" + "node": ">=10" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/daffl" + "url": "https://github.com/sponsors/sindresorhus" } }, - "packages/socketio-client": { - "name": "@feathersjs/socketio-client", - "version": "5.0.34", + "node_modules/yoctocolors-cjs": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", + "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", "license": "MIT", - "dependencies": { - "@feathersjs/feathers": "^5.0.34", - "@feathersjs/transport-commons": "^5.0.34" - }, - "devDependencies": { - "@feathersjs/commons": "^5.0.34", - "@feathersjs/memory": "^5.0.34", - "@feathersjs/socketio": "^5.0.34", - "@feathersjs/tests": "^5.0.34", - "@types/mocha": "^10.0.10", - "@types/node": "^24.1.0", - "mocha": "^11.7.1", - "shx": "^0.4.0", - "socket.io-client": "^4.8.1", - "ts-node": "^10.9.2", - "typescript": "^5.9.2" - }, "engines": { - "node": ">= 12" + "node": ">=18" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/daffl" + "url": "https://github.com/sponsors/sindresorhus" } }, - "packages/tests": { - "name": "@feathersjs/tests", - "version": "5.0.34", + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", "license": "MIT", - "dependencies": { - "@types/lodash": "^4.17.20", - "axios": "^1.11.0", - "lodash": "^4.17.21" - }, - "devDependencies": { - "@feathersjs/feathers": "^5.0.34", - "@types/mocha": "^10.0.10", - "@types/node": "^24.1.0", - "mocha": "^11.7.1", - "shx": "^0.4.0", - "ts-node": "^10.9.2", - "typescript": "^5.9.2" - }, - "engines": { - "node": ">= 12" - }, "funding": { "type": "github", - "url": "https://github.com/sponsors/daffl" + "url": "https://github.com/sponsors/wooorm" } }, - "packages/transport-commons": { - "name": "@feathersjs/transport-commons", - "version": "5.0.34", + "packages/create-feathers": { + "version": "6.0.0-pre.3", "license": "MIT", "dependencies": { - "@feathersjs/commons": "^5.0.34", - "@feathersjs/errors": "^5.0.34", - "@feathersjs/feathers": "^5.0.34", - "encodeurl": "^2.0.0", - "lodash": "^4.17.21" + "@feathersjs/cli": "^5.0.34" + }, + "bin": { + "create-feathers": "bin/create-feathers.js" }, "devDependencies": { - "@types/encodeurl": "^1.0.3", - "@types/lodash": "^4.17.20", - "@types/mocha": "^10.0.10", - "@types/node": "^24.1.0", - "mocha": "^11.7.1", - "shx": "^0.4.0", - "ts-node": "^10.9.2", - "typescript": "^5.9.2" + "vitest": "^3.2.4" }, "engines": { - "node": ">= 12" + "node": ">= 18" }, "funding": { "type": "github", "url": "https://github.com/sponsors/daffl" } }, - "packages/typebox": { - "name": "@feathersjs/typebox", - "version": "5.0.34", + "packages/feathers": { + "version": "6.0.0-pre.3", "license": "MIT", "dependencies": { - "@feathersjs/schema": "^5.0.34", - "@sinclair/typebox": "^0.25.0" + "@types/qs": "^6.14.0", + "events": "^3.3.0", + "qs": "^6.14.0" }, "devDependencies": { - "@types/mocha": "^10.0.10", "@types/node": "^24.1.0", - "mocha": "^11.7.1", + "@vitest/coverage-v8": "^3.2.4", + "@whatwg-node/server": "^0.10.12", "shx": "^0.4.0", - "typescript": "^5.9.2" + "typescript": "^5.8.0", + "vitest": "^3.2.4" }, "engines": { - "node": ">= 12" + "node": ">= 20" }, "funding": { "type": "github", "url": "https://github.com/sponsors/daffl" } - }, - "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==" } } } diff --git a/package.json b/package.json index d9d51eb9d3..b692b9d13e 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,8 @@ { - "name": "@feathersjs/feathers", + "name": "feathers", "private": true, - "homepage": "http://feathersjs.com", + "description": "The API and real-time application framework", + "homepage": "https://feathersjs.com", "repository": { "type": "git", "url": "git://github.com/feathersjs/feathers.git" @@ -20,7 +21,7 @@ "url": "https://github.com/feathersjs/feathers/issues" }, "engines": { - "node": ">= 20" + "node": ">= 22" }, "workspaces": [ "docs", @@ -34,27 +35,29 @@ "publish:premajor": "lerna publish premajor --preid pre --pre-dist-tag pre && git commit -am \"chore: Update version and changelog\" && git push origin", "publish:prerelease": "lerna publish prerelease --preid pre --pre-dist-tag pre --dist-tag pre --force-publish && git commit -am \"chore: Update version and changelog\" && git push origin", "prettier": "npx prettier \"packages/{,!(node_modules)/**/(src|test)/**/}*.ts\" --write", - "eslint": "eslint \"packages/**/*.ts\" --fix", + "eslint": "ESLINT_USE_FLAT_CONFIG=false eslint \"packages/**/*.ts\" --fix", "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", + "update-dependencies": "npm exec --workspaces --include-workspace-root -- ncu -u --dep prod,dev,optional,peer", "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", - "test": "npm run lint && npm run compile && c8 lerna run test --ignore @feathersjs/tests", - "generate:package": "pinion run generators/package.ts" + "test": "npm run lint && npm run compile && vitest run --coverage", + "vitest": "vitest run --coverage", + "dev": "vitest" }, "devDependencies": { - "@featherscloud/pinion": "^0.5.4", - "@typescript-eslint/eslint-plugin": "^7.8.0", - "@typescript-eslint/parser": "^7.8.0", - "c8": "^9.1.0", - "eslint": "^8.57.0", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-prettier": "^5.1.3", - "lerna": "^8.1.2", - "npm-check-updates": "^16.14.20", - "prettier": "^3.2.5", - "typescript": "^5.4.5" + "@featherscloud/pinion": "^0.5.5", + "@typescript-eslint/eslint-plugin": "^8.38.0", + "@typescript-eslint/parser": "^8.38.0", + "@vitest/coverage-v8": "^3.2.4", + "eslint": "^9.32.0", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-prettier": "^5.5.3", + "lerna": "^8.2.3", + "npm-check-updates": "^18.0.2", + "prettier": "^3.6.2", + "typescript": "^5.8.0", + "vitest": "^3.2.4" } } diff --git a/packages/adapter-commons/CHANGELOG.md b/packages/adapter-commons/CHANGELOG.md deleted file mode 100644 index 3a060d245b..0000000000 --- a/packages/adapter-commons/CHANGELOG.md +++ /dev/null @@ -1,646 +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.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/adapter-commons - -## [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/adapter-commons - -## [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/adapter-commons - -## [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/adapter-commons - -## [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/adapter-commons - -## [5.0.26](https://github.com/feathersjs/feathers/compare/v5.0.25...v5.0.26) (2024-06-09) - -### Bug Fixes - -- **adapter-commons:** Faster sorter ([#3495](https://github.com/feathersjs/feathers/issues/3495)) ([22243e4](https://github.com/feathersjs/feathers/commit/22243e4d92edc1a7343b4cf42be6dfb22e8b86d5)) - -## [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/adapter-commons - -## [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/adapter-commons - -## [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/adapter-commons - -## [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/adapter-commons - -## [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/adapter-commons - -## [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/adapter-commons - -## [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/adapter-commons - -## [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/adapter-commons - -## [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/adapter-commons - -## [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/adapter-commons - -## [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/adapter-commons - -## [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/adapter-commons - -## [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/adapter-commons - -## [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/adapter-commons - -## [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/adapter-commons - -## [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/adapter-commons - -## [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/adapter-commons - -## [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/adapter-commons - -## [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/adapter-commons - -## [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) - -### Bug Fixes - -- **core:** Add PaginationParams to general find method ([#3095](https://github.com/feathersjs/feathers/issues/3095)) ([8ebdcf5](https://github.com/feathersjs/feathers/commit/8ebdcf5107fae5fa23920390052b871033de3a0a)) -- **core:** Use Symbol.for to instantiate shared symbols ([#3087](https://github.com/feathersjs/feathers/issues/3087)) ([7f3fc21](https://github.com/feathersjs/feathers/commit/7f3fc2167576f228f8183568eb52b077160e8d65)) - -# [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/adapter-commons - -# [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/adapter-commons - -# [5.0.0-pre.37](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.36...v5.0.0-pre.37) (2023-02-09) - -### Features - -- **mongodb:** Add Object ID keyword converter and update MongoDB CLI & docs ([#3041](https://github.com/feathersjs/feathers/issues/3041)) ([ca0994e](https://github.com/feathersjs/feathers/commit/ca0994eaecb5a31f310bc980d106834e11f24f41)) - -# [5.0.0-pre.36](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.35...v5.0.0-pre.36) (2023-01-29) - -### Bug Fixes - -- **databases:** Ensure that query sanitization is not necessary when using query schemas ([#3022](https://github.com/feathersjs/feathers/issues/3022)) ([dbf514e](https://github.com/feathersjs/feathers/commit/dbf514e85d1508b95c007462a39b3cadd4ff391d)) - -### Features - -- **database:** Add and to the query syntax ([#3021](https://github.com/feathersjs/feathers/issues/3021)) ([00cb0d9](https://github.com/feathersjs/feathers/commit/00cb0d9c302ae951ae007d3d6ceba33e254edd9c)) - -# [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) - -### Bug Fixes - -- **adapter-commons:** multiple type definition issues ([#2876](https://github.com/feathersjs/feathers/issues/2876)) ([4ff1ed0](https://github.com/feathersjs/feathers/commit/4ff1ed084eb2b2cb687de27a28c96a0dad4530b7)) - -### Features - -- **adapter:** Add patch data type to adapters and refactor AdapterBase usage ([#2906](https://github.com/feathersjs/feathers/issues/2906)) ([9ddc2e6](https://github.com/feathersjs/feathers/commit/9ddc2e6b028f026f939d6af68125847e5c6734b4)) - -# [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/adapter-commons - -# [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/adapter-commons - -# [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 @feathersjs/adapter-commons - -# [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/adapter-commons - -# [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/adapter-commons - -# [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/adapter-commons - -# [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/adapter-commons - -# [5.0.0-pre.24](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.23...v5.0.0-pre.24) (2022-06-21) - -### Features - -- **knex:** Add KnexJS SQL database adapter to core ([#2671](https://github.com/feathersjs/feathers/issues/2671)) ([9380fff](https://github.com/feathersjs/feathers/commit/9380fff58596e8bb90b8bb098d2795b7eadfec20)) - -# [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/adapter-commons - -# [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/adapter-commons - -# [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/adapter-commons - -# [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) - -### Bug Fixes - -- **adapter-commons:** Clarify adapter query filtering ([#2607](https://github.com/feathersjs/feathers/issues/2607)) ([2dac771](https://github.com/feathersjs/feathers/commit/2dac771b0a3298d6dd25994d05186701b0617718)) - -### Features - -- **mongodb:** Add feathers-mongodb adapter as @feathersjs/mongodb ([#2610](https://github.com/feathersjs/feathers/issues/2610)) ([6d43734](https://github.com/feathersjs/feathers/commit/6d43734a53db02c435cafc52a22dca414e5d0940)) -- **typescript:** Improve adapter typings ([#2605](https://github.com/feathersjs/feathers/issues/2605)) ([3b2ca0a](https://github.com/feathersjs/feathers/commit/3b2ca0a6a8e03e8390272c4d7e930b4bffdaacf5)) -- **typescript:** Improve params and query typeability ([#2600](https://github.com/feathersjs/feathers/issues/2600)) ([df28b76](https://github.com/feathersjs/feathers/commit/df28b7619161f1df5e700326f52cca1a92dc5d28)) - -### BREAKING CHANGES - -- **adapter-commons:** Changes the common adapter base class to use `sanitizeQuery` and `sanitizeData` - -# [5.0.0-pre.18](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.17...v5.0.0-pre.18) (2022-04-11) - -### Features - -- **core:** Add app.teardown functionality ([#2570](https://github.com/feathersjs/feathers/issues/2570)) ([fcdf524](https://github.com/feathersjs/feathers/commit/fcdf524ae1995bb59265d39f12e98b7794bed023)) -- **core:** Finalize app.teardown() functionality ([#2584](https://github.com/feathersjs/feathers/issues/2584)) ([1a166f3](https://github.com/feathersjs/feathers/commit/1a166f3ded811ecacf0ae8cb67880bc9fa2eeafa)) - -# [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/adapter-commons - -# [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/adapter-commons - -# [5.0.0-pre.15](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.14...v5.0.0-pre.15) (2021-11-27) - -### Bug Fixes - -- **adapter-commons:** clean up in sort.ts and select function ([#2492](https://github.com/feathersjs/feathers/issues/2492)) ([c3ec8a4](https://github.com/feathersjs/feathers/commit/c3ec8a418bdc85506e3c5100015720a45454d8d3)) -- **adapter-commons:** Fix sorting for embedded objects ([#2488](https://github.com/feathersjs/feathers/issues/2488)) ([9c22f70](https://github.com/feathersjs/feathers/commit/9c22f70a838cb6341775d91705a7527c8fc5590e)) -- **typescript:** Overall typing improvements ([#2478](https://github.com/feathersjs/feathers/issues/2478)) ([b8eb804](https://github.com/feathersjs/feathers/commit/b8eb804158556d9651a8607e3c3fda15e0bfd110)) - -# [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/adapter-commons - -# [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/adapter-commons - -# [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/adapter-commons - -# [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/adapter-commons - -# [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/adapter-commons - -# [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/adapter-commons - -# [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/adapter-commons - -# [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/adapter-commons - -# [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/adapter-commons - -# [5.0.0-pre.5](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.4...v5.0.0-pre.5) (2021-06-23) - -### Bug Fixes - -- Update database adapter common repository urls ([#2380](https://github.com/feathersjs/feathers/issues/2380)) ([3f4db68](https://github.com/feathersjs/feathers/commit/3f4db68d6700c7d9023ecd17d0d39893f75a19fd)) - -### Features - -- **adapter-commons:** Add support for params.adapter option and move memory adapter to @feathersjs/memory ([#2367](https://github.com/feathersjs/feathers/issues/2367)) ([a43e7da](https://github.com/feathersjs/feathers/commit/a43e7da22b6b981a96d1321736ea9a0cb924fb4f)) -- **typescript:** Allow to pass generic service options to adapter services ([#2392](https://github.com/feathersjs/feathers/issues/2392)) ([f9431f2](https://github.com/feathersjs/feathers/commit/f9431f242354f804cafb835519f98dd405ac4f0b)) - -# [5.0.0-pre.4](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.3...v5.0.0-pre.4) (2021-05-13) - -### Bug Fixes - -- **typescript:** Move Paginated type back for better compatibility ([#2350](https://github.com/feathersjs/feathers/issues/2350)) ([2917d05](https://github.com/feathersjs/feathers/commit/2917d05fffb4716d3c4cdaa5ac6a1aee0972e8a6)) - -# [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/adapter-commons - -# [5.0.0-beta.1](https://github.com/feathersjs/feathers/compare/v5.0.0-beta.0...v5.0.0-beta.1) (2021-04-03) - -### Bug Fixes - -- **dependencies:** Fix transport-commons dependency and update other dependencies ([#2284](https://github.com/feathersjs/feathers/issues/2284)) ([05b03b2](https://github.com/feathersjs/feathers/commit/05b03b27b40604d956047e3021d8053c3a137616)) - -### Features - -- **adapter-commons:** Added mongoDB like search in embedded objects ([687e3c7](https://github.com/feathersjs/feathers/commit/687e3c7c36904221b2707d0220c0893e3cb1faa9)) - -# [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 - -- **adapter-commons:** Always respect paginate.max ([#2267](https://github.com/feathersjs/feathers/issues/2267)) ([f588257](https://github.com/feathersjs/feathers/commit/f5882575536624ed3a32bb6e3ff1919fa17e366d)) -- Update Grant usage and other dependencies ([#2264](https://github.com/feathersjs/feathers/issues/2264)) ([7b0f8fa](https://github.com/feathersjs/feathers/commit/7b0f8fad252419ed0ad0bf259cdf3104d322ab60)) -- **adapter-commons:** Return missing overloads ([#2203](https://github.com/feathersjs/feathers/issues/2203)) ([bbe7e2a](https://github.com/feathersjs/feathers/commit/bbe7e2a131633e9a6e7aac7f7fa02a312bca63c7)) - -### Features - -- Feathers v5 core refactoring and features ([#2255](https://github.com/feathersjs/feathers/issues/2255)) ([2dafb7c](https://github.com/feathersjs/feathers/commit/2dafb7ce14ba57406aeec13d10ca45b1e709bee9)) - -# [5.0.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.5.11...v5.0.0-pre.1) (2020-12-17) - -### Features - -- **memory:** Move feathers-memory into @feathersjs/memory ([#2153](https://github.com/feathersjs/feathers/issues/2153)) ([dd61fe3](https://github.com/feathersjs/feathers/commit/dd61fe371fb0502f78b8ccbe1f45a030e31ecff6)) - -## [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/adapter-commons - -## [4.5.7](https://github.com/feathersjs/feathers/compare/v4.5.6...v4.5.7) (2020-10-21) - -### Bug Fixes - -- **typescript:** Remove remaining overloads ([a29fabc](https://github.com/feathersjs/databases/commit/a29fabc9cf6050793a5e93948507ce3e19a235dd)) - -## [4.5.6](https://github.com/feathersjs/feathers/compare/v4.5.5...v4.5.6) (2020-10-21) - -### Bug Fixes - -- Revert "fix(adapter-commons): Add missing overloads ([#4](https://github.com/feathersjs/databases/issues/4))" ([dfaa850](https://github.com/feathersjs/databases/commit/dfaa8500644021f78d6234a79358f1b26ce2c8d3)) - -## [4.5.5](https://github.com/feathersjs/feathers/compare/v4.5.4...v4.5.5) (2020-10-21) - -### Bug Fixes - -- **typescript:** Revert "fix: add overloads for `find` ([#9](https://github.com/feathersjs/databases/issues/9))" ([85c20b2](https://github.com/feathersjs/databases/commit/85c20b267e67192169ded97dd5056f116a5ad7b5)) - -## [4.5.4](https://github.com/feathersjs/feathers/compare/v4.5.3...v4.5.4) (2020-09-27) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -## 4.5.3 (2020-09-24) - -### Bug Fixes - -- add overloads for `find` ([#9](https://github.com/feathersjs/databases/issues/9)) ([87c7c29](https://github.com/feathersjs/databases/commit/87c7c29ef017b3cae135e7b7597a7e63fb7d0961)) -- **adapter-commons:** Add missing overloads ([#4](https://github.com/feathersjs/databases/issues/4)) ([b6c80ff](https://github.com/feathersjs/databases/commit/b6c80ff39a32c1b023178f06cffbcaa6d08c554d)) -- Improve Service typings for DB Common API ([#1](https://github.com/feathersjs/databases/issues/1)) ([fd3b949](https://github.com/feathersjs/databases/commit/fd3b9496b0a46f8fd9779c2603faeeb92bd1afc1)) - -## [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/adapter-commons - -## [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/adapter-commons - -# [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/adapter-commons - -## [4.4.3](https://github.com/feathersjs/feathers/compare/v4.4.1...v4.4.3) (2019-12-06) - -### Bug Fixes - -- **adapter-commons:** Filter arrays in queries ([#1724](https://github.com/feathersjs/feathers/issues/1724)) ([872b669](https://github.com/feathersjs/feathers/commit/872b66906a806ab92ca41b5f6f504ff0af1ce79e)) - -## [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/adapter-commons - -# [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/adapter-commons - -## [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/adapter-commons - -## [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/adapter-commons - -## [4.3.9](https://github.com/feathersjs/feathers/compare/v4.3.8...v4.3.9) (2019-10-26) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -## [4.3.8](https://github.com/feathersjs/feathers/compare/v4.3.7...v4.3.8) (2019-10-14) - -### Bug Fixes - -- Remove adapter commons type alternatives ([#1620](https://github.com/feathersjs/feathers/issues/1620)) ([c9f3086](https://github.com/feathersjs/feathers/commit/c9f3086344420b57dbce7c4169cf550c97509f0d)) - -## [4.3.7](https://github.com/feathersjs/feathers/compare/v4.3.6...v4.3.7) (2019-10-14) - -### Bug Fixes - -- improve Service and AdapterService types ([#1567](https://github.com/feathersjs/feathers/issues/1567)) ([baad6a2](https://github.com/feathersjs/feathers/commit/baad6a26f0f543b712ccb40359b3933ad3a21392)) - -## [4.3.6](https://github.com/feathersjs/feathers/compare/v4.3.5...v4.3.6) (2019-10-07) - -### Bug Fixes - -- Check query for NaN ([#1607](https://github.com/feathersjs/feathers/issues/1607)) ([f1a781f](https://github.com/feathersjs/feathers/commit/f1a781f)) - -## [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/adapter-commons - -## [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/adapter-commons - -## [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/adapter-commons - -## [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/adapter-commons - -# [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/adapter-commons - -# [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/adapter-commons - -# [4.3.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.2...v4.3.0-pre.3) (2019-08-19) - -### Bug Fixes - -- Update all dependencies ([7d53a00](https://github.com/feathersjs/feathers/commit/7d53a00)) - -# [4.3.0-pre.2](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.1...v4.3.0-pre.2) (2019-08-02) - -### Bug Fixes - -- @feathersjs/adapter-commons: `update` id is non-nullable ([#1468](https://github.com/feathersjs/feathers/issues/1468)) ([43ec802](https://github.com/feathersjs/feathers/commit/43ec802)) - -# [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/adapter-commons - -# [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/adapter-commons - -# [4.0.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.3...v4.0.0-pre.4) (2019-07-05) - -### Bug Fixes - -- @feathersjs/adapter-commons: remove data from `remove` arguments ([#1426](https://github.com/feathersjs/feathers/issues/1426)) ([fd54ae9](https://github.com/feathersjs/feathers/commit/fd54ae9)) - -### Features - -- adapter-commons: add `allowsMulti(method)` to AdapterService ([#1431](https://github.com/feathersjs/feathers/issues/1431)) ([e688851](https://github.com/feathersjs/feathers/commit/e688851)) -- Add hook-less methods and service option types to adapter-commons ([#1433](https://github.com/feathersjs/feathers/issues/1433)) ([857f54a](https://github.com/feathersjs/feathers/commit/857f54a)) - -# [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) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -# [4.0.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.0...v4.0.0-pre.1) (2019-05-08) - -**Note:** Version bump only for package @feathersjs/adapter-commons - -# [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 - -- Update all dependencies to latest ([#1206](https://github.com/feathersjs/feathers/issues/1206)) ([e51e0f6](https://github.com/feathersjs/feathers/commit/e51e0f6)) -- **adapter-commons:** Keep Symbols when filtering a query ([#1141](https://github.com/feathersjs/feathers/issues/1141)) ([c9f55d8](https://github.com/feathersjs/feathers/commit/c9f55d8)) -- **chore:** Add .npmignore to adapter-commons ([8e129d8](https://github.com/feathersjs/feathers/commit/8e129d8)) -- Add whitelist and filter support to common adapter service ([#1132](https://github.com/feathersjs/feathers/issues/1132)) ([df1daaa](https://github.com/feathersjs/feathers/commit/df1daaa)) -- Fix AdapterService multi option when set to true ([#1134](https://github.com/feathersjs/feathers/issues/1134)) ([40402fc](https://github.com/feathersjs/feathers/commit/40402fc)) -- Throw error in `filterQuery` when query parameter is unknown ([#1131](https://github.com/feathersjs/feathers/issues/1131)) ([cd1a183](https://github.com/feathersjs/feathers/commit/cd1a183)) -- Update adapter common tests ([#1135](https://github.com/feathersjs/feathers/issues/1135)) ([8166dda](https://github.com/feathersjs/feathers/commit/8166dda)) -- Update adapter common tests to check for falsy ([#1140](https://github.com/feathersjs/feathers/issues/1140)) ([2856722](https://github.com/feathersjs/feathers/commit/2856722)) - -### chore - -- **package:** Move adapter tests into their own module ([#1164](https://github.com/feathersjs/feathers/issues/1164)) ([dcc1e6b](https://github.com/feathersjs/feathers/commit/dcc1e6b)) - -### 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)) -- Common database adapter utilities and test suite ([#1130](https://github.com/feathersjs/feathers/issues/1130)) ([17b3dc8](https://github.com/feathersjs/feathers/commit/17b3dc8)) - -### BREAKING CHANGES - -- **package:** Removes adapter tests from @feathersjs/adapter-commons -- Move database adapter utilities from @feathersjs/commons into its own module - -# [2.0.0](https://github.com/feathersjs/feathers/compare/@feathersjs/adapter-commons@1.0.7...@feathersjs/adapter-commons@2.0.0) (2019-01-10) - -### chore - -- **package:** Move adapter tests into their own module ([#1164](https://github.com/feathersjs/feathers/issues/1164)) ([dcc1e6b](https://github.com/feathersjs/feathers/commit/dcc1e6b)) - -### BREAKING CHANGES - -- **package:** Removes adapter tests from @feathersjs/adapter-commons - -## [1.0.7](https://github.com/feathersjs/feathers/compare/@feathersjs/adapter-commons@1.0.6...@feathersjs/adapter-commons@1.0.7) (2019-01-02) - -### Bug Fixes - -- **chore:** Add .npmignore to adapter-commons ([8e129d8](https://github.com/feathersjs/feathers/commit/8e129d8)) - -## [1.0.6](https://github.com/feathersjs/feathers/compare/@feathersjs/adapter-commons@1.0.5...@feathersjs/adapter-commons@1.0.6) (2018-12-21) - -### Bug Fixes - -- **adapter-commons:** Keep Symbols when filtering a query ([#1141](https://github.com/feathersjs/feathers/issues/1141)) ([c9f55d8](https://github.com/feathersjs/feathers/commit/c9f55d8)) - -## [1.0.5](https://github.com/feathersjs/feathers/compare/@feathersjs/adapter-commons@1.0.4...@feathersjs/adapter-commons@1.0.5) (2018-12-20) - -### Bug Fixes - -- Update adapter common tests to check for falsy ([#1140](https://github.com/feathersjs/feathers/issues/1140)) ([2856722](https://github.com/feathersjs/feathers/commit/2856722)) - -## [1.0.4](https://github.com/feathersjs/feathers/compare/@feathersjs/adapter-commons@1.0.3...@feathersjs/adapter-commons@1.0.4) (2018-12-17) - -### Bug Fixes - -- Update adapter common tests ([#1135](https://github.com/feathersjs/feathers/issues/1135)) ([8166dda](https://github.com/feathersjs/feathers/commit/8166dda)) - - - -## [1.0.3](https://github.com/feathersjs/feathers/compare/@feathersjs/adapter-commons@1.0.2...@feathersjs/adapter-commons@1.0.3) (2018-12-17) - -### Bug Fixes - -- Fix AdapterService multi option when set to true ([#1134](https://github.com/feathersjs/feathers/issues/1134)) ([40402fc](https://github.com/feathersjs/feathers/commit/40402fc)) - - - -## [1.0.2](https://github.com/feathersjs/feathers/compare/@feathersjs/adapter-commons@1.0.1...@feathersjs/adapter-commons@1.0.2) (2018-12-17) - -### Bug Fixes - -- Add whitelist and filter support to common adapter service ([#1132](https://github.com/feathersjs/feathers/issues/1132)) ([df1daaa](https://github.com/feathersjs/feathers/commit/df1daaa)) - - - -## [1.0.1](https://github.com/feathersjs/feathers/compare/@feathersjs/adapter-commons@1.0.0...@feathersjs/adapter-commons@1.0.1) (2018-12-17) - -### Bug Fixes - -- Throw error in `filterQuery` when query parameter is unknown ([#1131](https://github.com/feathersjs/feathers/issues/1131)) ([cd1a183](https://github.com/feathersjs/feathers/commit/cd1a183)) - - - -# 1.0.0 (2018-12-16) - -### Features - -- Common database adapter utilities and test suite ([#1130](https://github.com/feathersjs/feathers/issues/1130)) ([17b3dc8](https://github.com/feathersjs/feathers/commit/17b3dc8)) - -### BREAKING CHANGES - -- Move database adapter utilities from @feathersjs/commons into its own module diff --git a/packages/adapter-commons/LICENSE b/packages/adapter-commons/LICENSE deleted file mode 100644 index 7712f870f3..0000000000 --- a/packages/adapter-commons/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2024 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 -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -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 deleted file mode 100644 index 4e9d263c6f..0000000000 --- a/packages/adapter-commons/README.md +++ /dev/null @@ -1,27 +0,0 @@ -# Feathers Adapter Commons - -[![CI](https://github.com/feathersjs/feathers/workflows/Node.js%20CI/badge.svg)](https://github.com/feathersjs/feathers/actions?query=workflow%3A%22Node.js+CI%22) -[![Download Status](https://img.shields.io/npm/dm/@feathersjs/adapter-commons.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/adapter-commons) -[![Discord](https://badgen.net/badge/icon/discord?icon=discord&label)](https://discord.gg/qa8kez8QBx) - -> Shared utility functions for Feathers adatabase adapters - -## Installation - -``` -npm install @feathersjs/adapter-commons --save -``` - -## Documentation - -Refer to the [Feathers database adapter documentation](https://feathersjs.com/api/databases/common.html) for more details. - -## Authors - -[Feathers contributors](https://github.com/feathersjs/adapter-commons/graphs/contributors) - -## License - -Copyright (c) 2024 [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 deleted file mode 100644 index 44277b1835..0000000000 --- a/packages/adapter-commons/package.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "name": "@feathersjs/adapter-commons", - "version": "5.0.34", - "description": "Shared database adapter utility functions", - "homepage": "https://feathersjs.com", - "keywords": [ - "feathers" - ], - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/feathers" - }, - "repository": { - "type": "git", - "url": "git://github.com/feathersjs/feathers.git", - "directory": "packages/adapter-commons" - }, - "author": { - "name": "Feathers contributor", - "email": "hello@feathersjs.com", - "url": "https://feathersjs.com" - }, - "contributors": [], - "bugs": { - "url": "https://github.com/feathersjs/feathers/issues" - }, - "engines": { - "node": ">= 12" - }, - "main": "lib/", - "types": "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" - }, - "directories": { - "lib": "lib" - }, - "files": [ - "CHANGELOG.md", - "LICENSE", - "README.md", - "src/**", - "lib/**" - ], - "publishConfig": { - "access": "public" - }, - "dependencies": { - "@feathersjs/commons": "^5.0.34", - "@feathersjs/errors": "^5.0.34", - "@feathersjs/feathers": "^5.0.34" - }, - "devDependencies": { - "@types/mocha": "^10.0.10", - "@types/mongodb": "^4.0.6", - "@types/node": "^24.1.0", - "mocha": "^11.7.1", - "mongodb": "^6.18.0", - "shx": "^0.4.0", - "ts-node": "^10.9.2", - "typescript": "^5.9.2" - }, - "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" -} diff --git a/packages/adapter-commons/src/declarations.ts b/packages/adapter-commons/src/declarations.ts deleted file mode 100644 index ce35da3dca..0000000000 --- a/packages/adapter-commons/src/declarations.ts +++ /dev/null @@ -1,162 +0,0 @@ -import { Query, Params, Paginated, Id, PaginationParams, PaginationOptions } from '@feathersjs/feathers' - -export type FilterQueryOptions = { - filters?: FilterSettings - operators?: string[] - paginate?: PaginationParams -} - -export type QueryFilter = (value: any, options: FilterQueryOptions) => any - -export type FilterSettings = { - [key: string]: QueryFilter | true -} - -// re-export from @feathersjs/feathers to prevent breaking changes -export { PaginationOptions, PaginationParams } - -export interface AdapterServiceOptions { - /** - * Whether to allow multiple updates for everything (`true`) or specific methods (e.g. `['create', 'remove']`) - */ - multi?: boolean | string[] - /** - * The name of the id property - */ - id?: string - /** - * Pagination settings for this service - */ - paginate?: PaginationParams - /** - * A list of additional property query operators to allow in a query - * - * @deprecated No longer needed when a query schema is used - */ - operators?: string[] - /** - * An object of additional top level query filters, e.g. `{ $populate: true }` - * Can also be a converter function like `{ $ignoreCase: (value) => value === 'true' ? true : false }` - * - * @deprecated No longer needed when a query schema is used - */ - filters?: FilterSettings - /** - * @deprecated Use service `events` option when registering the service with `app.use`. - */ - events?: string[] - /** - * @deprecated No longer needed when a query schema is used - */ - whitelist?: string[] -} - -export interface AdapterQuery extends Query { - $limit?: number - $skip?: number - $select?: string[] - $sort?: { [key: string]: 1 | -1 } -} -/** - * Additional `params` that can be passed to an adapter service method call. - */ -export interface AdapterParams< - Q = AdapterQuery, - A extends Partial = Partial -> extends Params { - adapter?: A - paginate?: PaginationParams -} - -/** - * Hook-less (internal) service methods. Directly call database adapter service methods - * without running any service-level hooks or sanitization. This can be useful if you need the raw data - * from the service and don't want to trigger any of its hooks. - * - * Important: These methods are only available internally on the server, not on the client - * side and only for the Feathers database adapters. - * - * These methods do not trigger events. - * - * @see {@link https://docs.feathersjs.com/guides/migrating.html#hook-less-service-methods} - */ -export interface InternalServiceMethods< - Result = any, - Data = Result, - PatchData = Partial, - Params extends AdapterParams = AdapterParams, - IdType = Id -> { - /** - * Retrieve all resources from this service. - * Does not sanitize the query and should only be used on the server. - * - * @param _params - Service call parameters {@link Params} - */ - _find(_params?: Params & { paginate?: PaginationOptions }): Promise> - _find(_params?: Params & { paginate: false }): Promise - _find(params?: Params): Promise> - - /** - * Retrieve a single resource matching the given ID, skipping any service-level hooks. - * Does not sanitize the query and should only be used on the server. - * - * @param id - ID of the resource to locate - * @param params - Service call parameters {@link Params} - * @see {@link HookLessServiceMethods} - * @see {@link https://docs.feathersjs.com/api/services.html#get-id-params|Feathers API Documentation: .get(id, params)} - */ - _get(id: IdType, params?: Params): Promise - - /** - * Create a new resource for this service, skipping any service-level hooks. - * Does not sanitize data or checks if multiple updates are allowed and should only be used on the server. - * - * @param data - Data to insert into this service. - * @param params - Service call parameters {@link Params} - * @see {@link HookLessServiceMethods} - * @see {@link https://docs.feathersjs.com/api/services.html#create-data-params|Feathers API Documentation: .create(data, params)} - */ - _create(data: Data, params?: Params): Promise - _create(data: Data[], params?: Params): Promise - _create(data: Data | Data[], params?: Params): Promise - - /** - * Completely replace the resource identified by id, skipping any service-level hooks. - * Does not sanitize data or query and should only be used on the server. - * - * @param id - ID of the resource to be updated - * @param data - Data to be put in place of the current resource. - * @param params - Service call parameters {@link Params} - * @see {@link HookLessServiceMethods} - * @see {@link https://docs.feathersjs.com/api/services.html#update-id-data-params|Feathers API Documentation: .update(id, data, params)} - */ - _update(id: IdType, data: Data, params?: Params): Promise - - /** - * Merge any resources matching the given ID with the given data, skipping any service-level hooks. - * Does not sanitize the data or query and should only be used on the server. - * - * @param id - ID of the resource to be patched - * @param data - Data to merge with the current resource. - * @param params - Service call parameters {@link Params} - * @see {@link HookLessServiceMethods} - * @see {@link https://docs.feathersjs.com/api/services.html#patch-id-data-params|Feathers API Documentation: .patch(id, data, params)} - */ - _patch(id: null, data: PatchData, params?: Params): Promise - _patch(id: IdType, data: PatchData, params?: Params): Promise - _patch(id: IdType | null, data: PatchData, params?: Params): Promise - - /** - * Remove resources matching the given ID from the this service, skipping any service-level hooks. - * Does not sanitize query and should only be used on the server. - * - * @param id - ID of the resource to be removed - * @param params - Service call parameters {@link Params} - * @see {@link HookLessServiceMethods} - * @see {@link https://docs.feathersjs.com/api/services.html#remove-id-params|Feathers API Documentation: .remove(id, params)} - */ - _remove(id: null, params?: Params): Promise - _remove(id: IdType, params?: Params): Promise - _remove(id: IdType | null, params?: Params): Promise -} diff --git a/packages/adapter-commons/src/index.ts b/packages/adapter-commons/src/index.ts deleted file mode 100644 index 8007e44e00..0000000000 --- a/packages/adapter-commons/src/index.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { _ } from '@feathersjs/commons' -import { Params } from '@feathersjs/feathers' - -export * from './declarations' -export * from './service' -export * from './query' -export * from './sort' - -// Return a function that filters a result object or array -// and picks only the fields passed as `params.query.$select` -// and additional `otherFields` -export function select(params: Params, ...otherFields: string[]) { - const queryFields: string[] | undefined = params?.query?.$select - - if (!queryFields) { - return (result: any) => result - } - - const resultFields = queryFields.concat(otherFields) - const convert = (result: any) => _.pick(result, ...resultFields) - - return (result: any) => { - if (Array.isArray(result)) { - return result.map(convert) - } - - return convert(result) - } -} diff --git a/packages/adapter-commons/src/query.ts b/packages/adapter-commons/src/query.ts deleted file mode 100644 index 1dc31ffdec..0000000000 --- a/packages/adapter-commons/src/query.ts +++ /dev/null @@ -1,158 +0,0 @@ -import { _ } from '@feathersjs/commons' -import { BadRequest } from '@feathersjs/errors' -import { Query } from '@feathersjs/feathers' -import { FilterQueryOptions, FilterSettings, PaginationParams } from './declarations' - -const parse = (value: any) => (typeof value !== 'undefined' ? parseInt(value, 10) : value) - -const isPlainObject = (value: any) => _.isObject(value) && value.constructor === {}.constructor - -const validateQueryProperty = (query: any, operators: string[] = []): Query => { - if (!isPlainObject(query)) { - return query - } - - for (const key of Object.keys(query)) { - if (key.startsWith('$') && !operators.includes(key)) { - throw new BadRequest(`Invalid query parameter ${key}`, query) - } - - const value = query[key] - - if (isPlainObject(value)) { - query[key] = validateQueryProperty(value, operators) - } - } - - return { - ...query - } -} - -const getFilters = (query: Query, settings: FilterQueryOptions) => { - const filterNames = Object.keys(settings.filters) - - return filterNames.reduce( - (current, key) => { - const queryValue = query[key] - const filter = settings.filters[key] - - if (filter) { - const value = typeof filter === 'function' ? filter(queryValue, settings) : queryValue - - if (value !== undefined) { - current[key] = value - } - } - - return current - }, - {} as { [key: string]: any } - ) -} - -const getQuery = (query: Query, settings: FilterQueryOptions) => { - const keys = Object.keys(query).concat(Object.getOwnPropertySymbols(query) as any as string[]) - - return keys.reduce((result, key) => { - if (typeof key === 'string' && key.startsWith('$')) { - if (settings.filters[key] === undefined) { - throw new BadRequest(`Invalid filter value ${key}`) - } - } else { - result[key] = validateQueryProperty(query[key], settings.operators) - } - - return result - }, {} as Query) -} - -/** - * Returns the converted `$limit` value based on the `paginate` configuration. - * @param _limit The limit value - * @param paginate The pagination options - * @returns The converted $limit value - */ -export const getLimit = (_limit: any, paginate?: PaginationParams) => { - const limit = parse(_limit) - - if (paginate && (paginate.default || paginate.max)) { - const base = paginate.default || 0 - const lower = typeof limit === 'number' && !isNaN(limit) && limit >= 0 ? limit : base - const upper = typeof paginate.max === 'number' ? paginate.max : Number.MAX_VALUE - - return Math.min(lower, upper) - } - - return limit -} - -export const OPERATORS = ['$in', '$nin', '$lt', '$lte', '$gt', '$gte', '$ne', '$or'] - -export const FILTERS: FilterSettings = { - $skip: (value: any) => parse(value), - $sort: (sort: any): { [key: string]: number } => { - if (typeof sort !== 'object' || Array.isArray(sort)) { - return sort - } - - return Object.keys(sort).reduce( - (result, key) => { - result[key] = typeof sort[key] === 'object' ? sort[key] : parse(sort[key]) - - return result - }, - {} as { [key: string]: number } - ) - }, - $limit: (_limit: any, { paginate }: FilterQueryOptions) => getLimit(_limit, paginate), - $select: (select: any) => { - if (Array.isArray(select)) { - return select.map((current) => `${current}`) - } - - return select - }, - $or: (or: any, { operators }: FilterQueryOptions) => { - if (Array.isArray(or)) { - return or.map((current) => validateQueryProperty(current, operators)) - } - - return or - }, - $and: (and: any, { operators }: FilterQueryOptions) => { - if (Array.isArray(and)) { - return and.map((current) => validateQueryProperty(current, operators)) - } - - return and - } -} - -/** - * Converts Feathers special query parameters and pagination settings - * and returns them separately as `filters` and the rest of the query - * as `query`. `options` also gets passed the pagination settings and - * a list of additional `operators` to allow when querying properties. - * - * @param query The initial query - * @param options Options for filtering the query - * @returns An object with `query` which contains the query without `filters` - * and `filters` which contains the converted values for each filter. - */ -export function filterQuery(_query: Query, options: FilterQueryOptions = {}) { - const query = _query || {} - const settings = { - ...options, - filters: { - ...FILTERS, - ...options.filters - }, - operators: OPERATORS.concat(options.operators || []) - } - - return { - filters: getFilters(query, settings), - query: getQuery(query, settings) - } -} diff --git a/packages/adapter-commons/src/service.ts b/packages/adapter-commons/src/service.ts deleted file mode 100644 index cbaeb38718..0000000000 --- a/packages/adapter-commons/src/service.ts +++ /dev/null @@ -1,188 +0,0 @@ -import { Id, Paginated, Query } from '@feathersjs/feathers' -import { - AdapterParams, - AdapterServiceOptions, - InternalServiceMethods, - PaginationOptions -} from './declarations' -import { filterQuery } from './query' - -export const VALIDATED = Symbol.for('@feathersjs/adapter/sanitized') - -const alwaysMulti: { [key: string]: boolean } = { - find: true, - get: false, - update: false -} - -/** - * An abstract base class that a database adapter can extend from to implement the - * `__find`, `__get`, `__update`, `__patch` and `__remove` methods. - */ -export abstract class AdapterBase< - Result = any, - Data = Result, - PatchData = Partial, - ServiceParams extends AdapterParams = AdapterParams, - Options extends AdapterServiceOptions = AdapterServiceOptions, - IdType = Id -> implements InternalServiceMethods -{ - options: Options - - constructor(options: Options) { - this.options = { - id: 'id', - events: [], - paginate: false, - multi: false, - filters: {}, - operators: [], - ...options - } - } - - get id() { - return this.options.id - } - - get events() { - return this.options.events - } - - /** - * Check if this adapter allows multiple updates for a method. - * @param method The method name to check. - * @param params The service call params. - * @returns Wether or not multiple updates are allowed. - */ - allowsMulti(method: string, params: ServiceParams = {} as ServiceParams) { - const always = alwaysMulti[method] - - if (typeof always !== 'undefined') { - return always - } - - const { multi } = this.getOptions(params) - - if (multi === true || !multi) { - return multi - } - - return multi.includes(method) - } - - /** - * Returns the combined options for a service call. Options will be merged - * with `this.options` and `params.adapter` for dynamic overrides. - * - * @param params The parameters for the service method call - * @returns The actual options for this call - */ - getOptions(params: ServiceParams): Options { - const paginate = params.paginate !== undefined ? params.paginate : this.options.paginate - - return { - ...this.options, - paginate, - ...params.adapter - } - } - - /** - * Returns a sanitized version of `params.query`, converting filter values - * (like $limit and $skip) into the expected type. Will throw an error if - * a `$` prefixed filter or operator value that is not allowed in `filters` - * or `operators` is encountered. - * - * @param params The service call parameter. - * @returns A new object containing the sanitized query. - */ - async sanitizeQuery(params: ServiceParams = {} as ServiceParams): Promise { - // We don't need legacy query sanitisation if the query has been validated by a schema already - if (params.query && (params.query as any)[VALIDATED]) { - return params.query || {} - } - - const options = this.getOptions(params) - const { query, filters } = filterQuery(params.query, options) - - return { - ...filters, - ...query - } - } - - /** - * Retrieve all resources from this service. - * Does not sanitize the query and should only be used on the server. - * - * @param _params - Service call parameters {@link ServiceParams} - */ - abstract _find(_params?: ServiceParams & { paginate?: PaginationOptions }): Promise> - abstract _find(_params?: ServiceParams & { paginate: false }): Promise - abstract _find(params?: ServiceParams): Promise> - - /** - * Retrieve a single resource matching the given ID, skipping any service-level hooks. - * Does not sanitize the query and should only be used on the server. - * - * @param id - ID of the resource to locate - * @param params - Service call parameters {@link ServiceParams} - * @see {@link HookLessServiceMethods} - * @see {@link https://docs.feathersjs.com/api/services.html#get-id-params|Feathers API Documentation: .get(id, params)} - */ - abstract _get(id: IdType, params?: ServiceParams): Promise - - /** - * Create a new resource for this service, skipping any service-level hooks. - * Does not check if multiple updates are allowed and should only be used on the server. - * - * @param data - Data to insert into this service. - * @param params - Service call parameters {@link ServiceParams} - * @see {@link HookLessServiceMethods} - * @see {@link https://docs.feathersjs.com/api/services.html#create-data-params|Feathers API Documentation: .create(data, params)} - */ - abstract _create(data: Data, params?: ServiceParams): Promise - abstract _create(data: Data[], params?: ServiceParams): Promise - abstract _create(data: Data | Data[], params?: ServiceParams): Promise - - /** - * Completely replace the resource identified by id, skipping any service-level hooks. - * Does not sanitize the query and should only be used on the server. - * - * @param id - ID of the resource to be updated - * @param data - Data to be put in place of the current resource. - * @param params - Service call parameters {@link ServiceParams} - * @see {@link HookLessServiceMethods} - * @see {@link https://docs.feathersjs.com/api/services.html#update-id-data-params|Feathers API Documentation: .update(id, data, params)} - */ - abstract _update(id: IdType, data: Data, params?: ServiceParams): Promise - - /** - * Merge any resources matching the given ID with the given data, skipping any service-level hooks. - * Does not sanitize the query and should only be used on the server. - * - * @param id - ID of the resource to be patched - * @param data - Data to merge with the current resource. - * @param params - Service call parameters {@link ServiceParams} - * @see {@link HookLessServiceMethods} - * @see {@link https://docs.feathersjs.com/api/services.html#patch-id-data-params|Feathers API Documentation: .patch(id, data, params)} - */ - abstract _patch(id: null, data: PatchData, params?: ServiceParams): Promise - abstract _patch(id: IdType, data: PatchData, params?: ServiceParams): Promise - abstract _patch(id: IdType | null, data: PatchData, params?: ServiceParams): Promise - - /** - * Remove resources matching the given ID from the this service, skipping any service-level hooks. - * Does not sanitize query and should only be used on the server. - * - * @param id - ID of the resource to be removed - * @param params - Service call parameters {@link ServiceParams} - * @see {@link HookLessServiceMethods} - * @see {@link https://docs.feathersjs.com/api/services.html#remove-id-params|Feathers API Documentation: .remove(id, params)} - */ - abstract _remove(id: null, params?: ServiceParams): Promise - abstract _remove(id: IdType, params?: ServiceParams): Promise - abstract _remove(id: IdType | null, params?: ServiceParams): Promise -} diff --git a/packages/adapter-commons/src/sort.ts b/packages/adapter-commons/src/sort.ts deleted file mode 100644 index d84cb69cc1..0000000000 --- a/packages/adapter-commons/src/sort.ts +++ /dev/null @@ -1,129 +0,0 @@ -// Sorting algorithm taken from NeDB (https://github.com/louischatriot/nedb) -// See https://github.com/louischatriot/nedb/blob/e3f0078499aa1005a59d0c2372e425ab789145c1/lib/model.js#L189 - -export function compareNSB(a: number | string | boolean, b: number | string | boolean): 0 | 1 | -1 { - if (a === b) { - return 0 - } - - return a < b ? -1 : 1 -} - -export function compareArrays(a: any[], b: any[]): 0 | 1 | -1 { - for (let i = 0, l = Math.min(a.length, b.length); i < l; i++) { - const comparison = compare(a[i], b[i]) - - if (comparison !== 0) { - return comparison - } - } - - // Common section was identical, longest one wins - return compareNSB(a.length, b.length) -} - -export function compare( - a: any, - b: any, - compareStrings: (a: any, b: any) => 0 | 1 | -1 = compareNSB -): 0 | 1 | -1 { - if (a === b) { - return 0 - } - - // null or undefined - if (a == null) { - return -1 - } - if (b == null) { - return 1 - } - - // detect typeof once - const typeofA = typeof a - const typeofB = typeof b - - // Numbers - if (typeofA === 'number') { - return typeofB === 'number' ? compareNSB(a, b) : -1 - } - if (typeofB === 'number') { - return 1 - } - - // Strings - if (typeofA === 'string') { - return typeofB === 'string' ? compareStrings(a, b) : -1 - } - if (typeofB === 'string') { - return 1 - } - - // Booleans - if (typeofA === 'boolean') { - return typeofB === 'boolean' ? compareNSB(a, b) : -1 - } - if (typeofB === 'boolean') { - return 1 - } - - // Dates - if (a instanceof Date) { - return b instanceof Date ? compareNSB(a.getTime(), b.getTime()) : -1 - } - if (b instanceof Date) { - return 1 - } - - // Arrays (first element is most significant and so on) - if (Array.isArray(a)) { - return Array.isArray(b) ? compareArrays(a, b) : -1 - } - if (Array.isArray(b)) { - return 1 - } - - // Objects - const aKeys = Object.keys(a).sort() - const bKeys = Object.keys(b).sort() - - for (let i = 0, l = Math.min(aKeys.length, bKeys.length); i < l; i++) { - const comparison = compare(a[aKeys[i]], b[bKeys[i]]) - - if (comparison !== 0) { - return comparison - } - } - - return compareNSB(aKeys.length, bKeys.length) -} - -// lodash-y get - probably want to use lodash get instead -const get = (value: any, path: string[]) => path.reduce((value, key) => value[key], value) - -// An in-memory sorting function according to the -// $sort special query parameter -export function sorter($sort: { [key: string]: -1 | 1 }) { - const compares = Object.keys($sort).map((key) => { - const direction = $sort[key] - - if (!key.includes('.')) { - return (a: any, b: any) => direction * compare(a[key], b[key]) - } else { - const path = key.split('.') - return (a: any, b: any) => direction * compare(get(a, path), get(b, path)) - } - }) - - return function (a: any, b: any) { - for (const compare of compares) { - const comparison = compare(a, b) - - if (comparison !== 0) { - return comparison - } - } - - return 0 - } -} diff --git a/packages/adapter-commons/test/commons.test.ts b/packages/adapter-commons/test/commons.test.ts deleted file mode 100644 index b0f5eb8d23..0000000000 --- a/packages/adapter-commons/test/commons.test.ts +++ /dev/null @@ -1,91 +0,0 @@ -import assert from 'assert' -import { select } from '../src' - -describe('@feathersjs/adapter-commons', () => { - describe('select', () => { - it('select', () => { - const selector = select({ - query: { $select: ['name', 'age'] } - }) - - return Promise.resolve({ - name: 'David', - age: 3, - test: 'me' - }) - .then(selector) - .then((result) => - assert.deepStrictEqual(result, { - name: 'David', - age: 3 - }) - ) - }) - - it('select with arrays', () => { - const selector = select({ - query: { $select: ['name', 'age'] } - }) - - return Promise.resolve([ - { - name: 'David', - age: 3, - test: 'me' - }, - { - name: 'D', - age: 4, - test: 'you' - } - ]) - .then(selector) - .then((result) => - assert.deepStrictEqual(result, [ - { - name: 'David', - age: 3 - }, - { - name: 'D', - age: 4 - } - ]) - ) - }) - - it('select with no query', () => { - const selector = select({}) - const data = { - name: 'David' - } - - return Promise.resolve(data) - .then(selector) - .then((result) => assert.deepStrictEqual(result, data)) - }) - - it('select with other fields', () => { - const selector = select( - { - query: { $select: ['name'] } - }, - 'id' - ) - const data = { - id: 'me', - name: 'David', - age: 10 - } - - return Promise.resolve(data) - .then(selector) - .then((result) => - assert.deepStrictEqual(result, { - id: 'me', - name: 'David' - }) - ) - }) - }) -}) diff --git a/packages/adapter-commons/test/fixture.ts b/packages/adapter-commons/test/fixture.ts deleted file mode 100644 index 43bd667d06..0000000000 --- a/packages/adapter-commons/test/fixture.ts +++ /dev/null @@ -1,115 +0,0 @@ -import { AdapterBase, AdapterParams, PaginationOptions } from '../src' -import { Id, NullableId, Paginated } from '@feathersjs/feathers' -import { BadRequest, MethodNotAllowed } from '@feathersjs/errors/lib' - -export type Data = { - id: Id -} - -export class MethodBase extends AdapterBase, AdapterParams> { - async _find(_params?: AdapterParams & { paginate?: PaginationOptions }): Promise> - async _find(_params?: AdapterParams & { paginate: false }): Promise - async _find(params?: AdapterParams): Promise> { - if (params && params.paginate === false) { - return [] - } - - return { - total: 0, - limit: 10, - skip: 0, - data: [] - } - } - - async _get(id: Id, _params?: AdapterParams): Promise { - return { id } - } - - async _create(data: Data, _params?: AdapterParams): Promise - async _create(data: Data[], _params?: AdapterParams): Promise - async _create(data: Data | Data[], _params?: AdapterParams): Promise - async _create(data: Data | Data[], _params?: AdapterParams): Promise { - if (Array.isArray(data)) { - return [ - { - id: 'something' - } - ] - } - - return { - id: 'something' - } - } - - async _update(id: Id, _data: Data, _params?: AdapterParams) { - return Promise.resolve({ id: id ?? _data.id }) - } - - async _patch(id: null, _data: Partial, _params?: AdapterParams): Promise - async _patch(id: Id, _data: Partial, _params?: AdapterParams): Promise - async _patch(id: NullableId, _data: Partial, _params?: AdapterParams): Promise - async _patch(id: NullableId, _data: Partial, _params?: AdapterParams): Promise { - if (id === null) { - return [] - } - - return { id } - } - - async _remove(id: null, _params?: AdapterParams): Promise - async _remove(id: Id, _params?: AdapterParams): Promise - async _remove(id: NullableId, _params?: AdapterParams): Promise - async _remove(id: NullableId, _params?: AdapterParams) { - if (id === null) { - return [] as Data[] - } - - return { id } - } -} - -export class MethodService extends MethodBase { - find(params?: AdapterParams): Promise> { - return this._find(params) - } - - get(id: Id, params?: AdapterParams): Promise { - return this._get(id, params) - } - - async create(data: Data[], _params?: AdapterParams): Promise - async create(data: Data, _params?: AdapterParams): Promise - async create(data: Data | Data[], params?: AdapterParams): Promise { - if (Array.isArray(data) && !this.allowsMulti('create', params)) { - throw new MethodNotAllowed('Can not create multiple entries') - } - - return this._create(data, params) - } - - async update(id: Id, data: Data, params?: AdapterParams) { - if (id === null || Array.isArray(data)) { - throw new BadRequest("You can not replace multiple instances. Did you mean 'patch'?") - } - - return this._update(id, data, params) - } - - async patch(id: NullableId, data: Partial, params?: AdapterParams) { - if (id === null && !this.allowsMulti('patch', params)) { - throw new MethodNotAllowed('Can not patch multiple entries') - } - - return this._patch(id, data, params) - } - - async remove(id: NullableId, params?: AdapterParams) { - if (id === null && !this.allowsMulti('remove', params)) { - throw new MethodNotAllowed('Can not remove multiple entries') - } - - return this._remove(id, params) - } -} diff --git a/packages/adapter-commons/test/query.test.ts b/packages/adapter-commons/test/query.test.ts deleted file mode 100644 index 805704c97e..0000000000 --- a/packages/adapter-commons/test/query.test.ts +++ /dev/null @@ -1,313 +0,0 @@ -import assert from 'assert' -import { ObjectId } from 'mongodb' -import { filterQuery } from '../src' - -describe('@feathersjs/adapter-commons/filterQuery', () => { - describe('$sort', () => { - it('returns $sort when present in query', () => { - const originalQuery = { $sort: { name: 1 } } - const { filters, query } = filterQuery(originalQuery) - - assert.strictEqual(filters.$sort.name, 1) - assert.deepStrictEqual(query, {}) - assert.deepStrictEqual( - originalQuery, - { - $sort: { name: 1 } - }, - 'does not modify original query' - ) - }) - - it('returns $sort when present in query as an object', () => { - const { filters, query } = filterQuery({ - $sort: { name: { something: 10 } } - }) - - assert.strictEqual(filters.$sort.name.something, 10) - assert.deepStrictEqual(query, {}) - }) - - it('converts strings in $sort', () => { - const { filters, query } = filterQuery({ $sort: { test: '-1' } }) - - assert.strictEqual(filters.$sort.test, -1) - assert.deepStrictEqual(query, {}) - }) - - it('does not convert $sort arrays', () => { - const $sort = [ - ['test', '-1'], - ['a', '1'] - ] - const { filters, query } = filterQuery({ $sort }) - - assert.strictEqual(filters.$sort, $sort) - assert.deepStrictEqual(query, {}) - }) - - it('throws an error when special parameter is not known', () => { - try { - const query = { $foo: 1 } - filterQuery(query) - assert.ok(false, 'Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'BadRequest') - assert.strictEqual(error.message, 'Invalid filter value $foo') - } - }) - - it('returns undefined when not present in query', () => { - const query = { foo: 1 } - const { filters } = filterQuery(query) - - assert.strictEqual(filters.$sort, undefined) - }) - }) - - describe('$limit', () => { - let testQuery: any - - beforeEach(() => { - testQuery = { $limit: 1 } - }) - - it('returns $limit when present in query', () => { - const { filters, query } = filterQuery(testQuery) - - assert.strictEqual(filters.$limit, 1) - assert.deepStrictEqual(query, {}) - }) - - it('returns undefined when not present in query', () => { - const query = { foo: 1 } - const { filters } = filterQuery(query) - - assert.strictEqual(filters.$limit, undefined) - }) - - it('removes $limit from query when present', () => { - assert.deepStrictEqual(filterQuery(testQuery).query, {}) - }) - - it('parses $limit strings into integers (#4)', () => { - const { filters } = filterQuery({ $limit: '2' }) - - assert.strictEqual(filters.$limit, 2) - }) - - it('allows $limit 0', () => { - const { filters } = filterQuery({ $limit: 0 }, { paginate: { default: 10 } }) - - assert.strictEqual(filters.$limit, 0) - }) - - describe('pagination', () => { - it('limits with default pagination', () => { - const { filters } = filterQuery({}, { paginate: { default: 10 } }) - const { filters: filtersNeg } = filterQuery({ $limit: -20 }, { paginate: { default: 5, max: 10 } }) - - assert.strictEqual(filters.$limit, 10) - assert.strictEqual(filtersNeg.$limit, 5) - }) - - it('limits with max pagination', () => { - const { filters } = filterQuery({ $limit: 20 }, { paginate: { default: 5, max: 10 } }) - - assert.strictEqual(filters.$limit, 10) - }) - - it('limits with default pagination when not a number', () => { - const { filters } = filterQuery({ $limit: 'something' }, { paginate: { default: 5, max: 10 } }) - - assert.strictEqual(filters.$limit, 5) - }) - - it('limits to 0 when no paginate.default and not a number', () => { - const { filters } = filterQuery({ $limit: 'something' }, { paginate: { max: 10 } }) - - assert.strictEqual(filters.$limit, 0) - }) - - it('still uses paginate.max when there is no paginate.default (#2104)', () => { - const { filters } = filterQuery({ $limit: 100 }, { paginate: { max: 10 } }) - - assert.strictEqual(filters.$limit, 10) - }) - }) - }) - - describe('$skip', () => { - let testQuery: any - - beforeEach(() => { - testQuery = { $skip: 1 } - }) - - it('returns $skip when present in query', () => { - const { filters } = filterQuery(testQuery) - - assert.strictEqual(filters.$skip, 1) - }) - - it('removes $skip from query when present', () => { - assert.deepStrictEqual(filterQuery(testQuery).query, {}) - }) - - it('returns undefined when not present in query', () => { - const query = { foo: 1 } - const { filters } = filterQuery(query) - - assert.strictEqual(filters.$skip, undefined) - }) - - it('parses $skip strings into integers (#4)', () => { - const { filters } = filterQuery({ $skip: '33' }) - - assert.strictEqual(filters.$skip, 33) - }) - }) - - describe('$select', () => { - let testQuery: any - - beforeEach(() => { - testQuery = { $select: 1 } - }) - - it('returns $select when present in query', () => { - const { filters } = filterQuery(testQuery) - - assert.strictEqual(filters.$select, 1) - }) - - it('removes $select from query when present', () => { - assert.deepStrictEqual(filterQuery(testQuery).query, {}) - }) - - it('returns undefined when not present in query', () => { - const query = { foo: 1 } - const { filters } = filterQuery(query) - - assert.strictEqual(filters.$select, undefined) - }) - - it('includes Symbols', () => { - const TEST = Symbol('testing') - const original = { - [TEST]: 'message', - other: true, - sub: { [TEST]: 'othermessage' } - } - - const { query } = filterQuery(original) - - assert.deepStrictEqual(query, { - [TEST]: 'message', - other: true, - sub: { [TEST]: 'othermessage' } - }) - }) - - it('only converts plain objects', () => { - const userId = new ObjectId() - const original = { - userId - } - - const { query } = filterQuery(original) - - assert.deepStrictEqual(query, original) - }) - }) - - describe('arrays', () => { - it('validates queries in arrays', () => { - assert.throws( - () => { - filterQuery({ - $or: [{ $exists: false }] - }) - }, - { - name: 'BadRequest', - message: 'Invalid query parameter $exists' - } - ) - }) - - it('allows default operators in $or', () => { - const { filters } = filterQuery({ - $or: [{ value: { $gte: 10 } }] - }) - - assert.deepStrictEqual(filters, { - $or: [{ value: { $gte: 10 } }] - }) - }) - }) - - describe('additional filters', () => { - it('throw error when not set as additionals', () => { - try { - filterQuery({ $select: 1, $known: 1 }) - assert.ok(false, 'Should never get here') - } catch (error: any) { - assert.strictEqual(error.message, 'Invalid filter value $known') - } - }) - - it('returns default and known additional filters (array)', () => { - const query = { $select: ['a', 'b'], $known: 1, $unknown: 1 } - const { filters } = filterQuery(query, { - filters: { - $known: true, - $unknown: true - } - }) - - assert.strictEqual(filters.$unknown, 1) - assert.strictEqual(filters.$known, 1) - assert.deepStrictEqual(filters.$select, ['a', 'b']) - }) - - it('returns default and known additional filters (object)', () => { - const { filters } = filterQuery( - { - $known: 1, - $select: 1 - }, - { filters: { $known: (value: any) => value.toString() } } - ) - - assert.strictEqual(filters.$unknown, undefined) - assert.strictEqual(filters.$known, '1') - assert.strictEqual(filters.$select, 1) - }) - }) - - describe('additional operators', () => { - it('returns query with default and known additional operators', () => { - const { query } = filterQuery( - { - prop: { $ne: 1, $known: 1 } - }, - { operators: ['$known'] } - ) - - assert.deepStrictEqual(query, { prop: { $ne: 1, $known: 1 } }) - }) - - it('throws an error with unknown query operator', () => { - assert.throws( - () => - filterQuery({ - prop: { $unknown: 'something' } - }), - { - message: 'Invalid query parameter $unknown' - } - ) - }) - }) -}) diff --git a/packages/adapter-commons/test/service.test.ts b/packages/adapter-commons/test/service.test.ts deleted file mode 100644 index ed5cc4a4c6..0000000000 --- a/packages/adapter-commons/test/service.test.ts +++ /dev/null @@ -1,227 +0,0 @@ -/* eslint-disable @typescript-eslint/no-unused-vars, @typescript-eslint/ban-ts-comment */ -import assert from 'assert' -import { VALIDATED } from '../src' -import { MethodService } from './fixture' - -const METHODS: ['find', 'get', 'create', 'update', 'patch', 'remove'] = [ - 'find', - 'get', - 'create', - 'update', - 'patch', - 'remove' -] - -describe('@feathersjs/adapter-commons/service', () => { - describe('works when methods exist', () => { - METHODS.forEach((method) => { - it(`${method}`, () => { - const service = new MethodService({}) - const args: any[] = [] - - if (method !== 'find') { - args.push('test') - } - - if (method === 'update' || method === 'patch') { - args.push({}) - } - - // @ts-ignore - return service[method](...args) - }) - }) - - it('does not allow multi patch', async () => { - const service = new MethodService({}) - - await assert.rejects(() => service.patch(null, {}), { - name: 'MethodNotAllowed', - message: 'Can not patch multiple entries' - }) - }) - - it('does not allow multi remove', async () => { - const service = new MethodService({}) - - await assert.rejects(() => service.remove(null, {}), { - name: 'MethodNotAllowed', - message: 'Can not remove multiple entries' - }) - }) - - it('does not allow multi create', async () => { - const service = new MethodService({}) - - await assert.rejects(() => service.create([], {}), { - name: 'MethodNotAllowed', - message: 'Can not create multiple entries' - }) - }) - - it('multi can be set to true', async () => { - const service = new MethodService({}) - - service.options.multi = true - - await service.create([]) - }) - }) - - it('sanitizeQuery', async () => { - const service = new MethodService({ - filters: { - $something: true - }, - operators: ['$test'] - }) - - assert.deepStrictEqual( - await service.sanitizeQuery({ - query: { $limit: '10', test: 'me' } as any - }), - { $limit: 10, test: 'me' } - ) - - assert.deepStrictEqual( - await service.sanitizeQuery({ - adapter: { - paginate: { max: 2 } - }, - query: { $limit: '10', test: 'me' } as any - }), - { $limit: 2, test: 'me' } - ) - - await assert.rejects( - () => - service.sanitizeQuery({ - query: { name: { $bla: 'me' } } - }), - { - message: 'Invalid query parameter $bla' - } - ) - - assert.deepStrictEqual( - await service.sanitizeQuery({ - adapter: { - operators: ['$bla'] - }, - query: { name: { $bla: 'Dave' } } - }), - { name: { $bla: 'Dave' } } - ) - - const validatedQuery = { name: { $bla: 'me' } } - - Object.defineProperty(validatedQuery, VALIDATED, { value: true }) - - assert.deepStrictEqual( - await service.sanitizeQuery({ - query: validatedQuery - }), - validatedQuery, - 'validated queries are not sanitized' - ) - }) - - it('getOptions', () => { - const service = new MethodService({ - multi: true, - paginate: { - default: 1, - max: 10 - } - }) - const opts = service.getOptions({ - adapter: { - multi: ['create'], - paginate: { - default: 10, - max: 100 - } - } - }) - - assert.deepStrictEqual(opts, { - id: 'id', - events: [], - paginate: { default: 10, max: 100 }, - multi: ['create'], - filters: {}, - operators: [] - }) - - const notPaginated = service.getOptions({ - paginate: false - }) - - assert.deepStrictEqual(notPaginated, { - id: 'id', - events: [], - paginate: false, - multi: true, - filters: {}, - operators: [] - }) - }) - - it('allowsMulti', () => { - context('with true', () => { - const service = new MethodService({ multi: true }) - - it('does return true for multiple methodes', () => { - assert.equal(service.allowsMulti('patch'), true) - }) - - it('does return false for always non-multiple methodes', () => { - assert.equal(service.allowsMulti('update'), false) - }) - - it('does return true for unknown methods', () => { - assert.equal(service.allowsMulti('other'), true) - }) - }) - - context('with false', () => { - const service = new MethodService({ multi: false }) - - it('does return false for multiple methodes', () => { - assert.equal(service.allowsMulti('remove'), false) - }) - - it('does return true for always multiple methodes', () => { - assert.equal(service.allowsMulti('find'), true) - }) - - it('does return false for unknown methods', () => { - assert.equal(service.allowsMulti('other'), false) - }) - }) - - context('with array', () => { - const service = new MethodService({ multi: ['create', 'get', 'other'] }) - - it('does return true for specified multiple methodes', () => { - assert.equal(service.allowsMulti('create'), true) - }) - - it('does return false for non-specified multiple methodes', () => { - assert.equal(service.allowsMulti('patch'), false) - }) - - it('does return false for specified always multiple methodes', () => { - assert.equal(service.allowsMulti('get'), false) - }) - - it('does return true for specified unknown methodes', () => { - assert.equal(service.allowsMulti('other'), true) - }) - - it('does return false for non-specified unknown methodes', () => { - assert.equal(service.allowsMulti('another'), false) - }) - }) - }) -}) diff --git a/packages/adapter-commons/test/sort.test.ts b/packages/adapter-commons/test/sort.test.ts deleted file mode 100644 index d361c681af..0000000000 --- a/packages/adapter-commons/test/sort.test.ts +++ /dev/null @@ -1,384 +0,0 @@ -import assert from 'assert' -import { sorter } from '../src' - -describe('@feathersjs/adapter-commons', () => { - describe('sorter', () => { - it('simple sorter', () => { - const array = [ - { - name: 'David' - }, - { - name: 'Eric' - } - ] - - const sort = sorter({ - name: -1 - }) - - assert.deepStrictEqual(array.sort(sort), [ - { - name: 'Eric' - }, - { - name: 'David' - } - ]) - }) - - it('simple sorter with arrays', () => { - const array = [ - { - names: ['a', 'b'] - }, - { - names: ['c', 'd'] - } - ] - - const sort = sorter({ - names: -1 - }) - - assert.deepStrictEqual(array.sort(sort), [ - { - names: ['c', 'd'] - }, - { - names: ['a', 'b'] - } - ]) - }) - - it('simple sorter with objects', () => { - const array = [ - { - names: { - first: 'Dave', - last: 'L' - } - }, - { - names: { - first: 'A', - last: 'B' - } - } - ] - - const sort = sorter({ - names: 1 - }) - - assert.deepStrictEqual(array.sort(sort), [ - { - names: { - first: 'A', - last: 'B' - } - }, - { - names: { - first: 'Dave', - last: 'L' - } - } - ]) - }) - - it('two property sorter', () => { - const array = [ - { - name: 'David', - counter: 0 - }, - { - name: 'Eric', - counter: 1 - }, - { - name: 'David', - counter: 1 - }, - { - name: 'Eric', - counter: 0 - } - ] - - const sort = sorter({ - name: -1, - counter: 1 - }) - - assert.deepStrictEqual(array.sort(sort), [ - { name: 'Eric', counter: 0 }, - { name: 'Eric', counter: 1 }, - { name: 'David', counter: 0 }, - { name: 'David', counter: 1 } - ]) - }) - - it('two property sorter with names', () => { - const array = [ - { - name: 'David', - counter: 0 - }, - { - name: 'Eric', - counter: 1 - }, - { - name: 'Andrew', - counter: 1 - }, - { - name: 'David', - counter: 1 - }, - { - name: 'Andrew', - counter: 0 - }, - { - name: 'Eric', - counter: 0 - } - ] - - const sort = sorter({ - name: -1, - counter: 1 - }) - - assert.deepStrictEqual(array.sort(sort), [ - { name: 'Eric', counter: 0 }, - { name: 'Eric', counter: 1 }, - { name: 'David', counter: 0 }, - { name: 'David', counter: 1 }, - { name: 'Andrew', counter: 0 }, - { name: 'Andrew', counter: 1 } - ]) - }) - - it('three property sorter with names', () => { - const array = [ - { - name: 'David', - counter: 0, - age: 2 - }, - { - name: 'Eric', - counter: 1, - age: 2 - }, - { - name: 'David', - counter: 1, - age: 1 - }, - { - name: 'Eric', - counter: 0, - age: 1 - }, - { - name: 'Andrew', - counter: 0, - age: 2 - }, - { - name: 'Andrew', - counter: 0, - age: 1 - } - ] - - const sort = sorter({ - name: -1, - counter: 1, - age: -1 - }) - - assert.deepStrictEqual(array.sort(sort), [ - { name: 'Eric', counter: 0, age: 1 }, - { name: 'Eric', counter: 1, age: 2 }, - { name: 'David', counter: 0, age: 2 }, - { name: 'David', counter: 1, age: 1 }, - { name: 'Andrew', counter: 0, age: 2 }, - { name: 'Andrew', counter: 0, age: 1 } - ]) - }) - }) - - describe('sorter mongoDB-like sorting on embedded objects', () => { - let data: any[] = [] - - beforeEach(() => { - data = [ - { _id: 1, item: { category: 'cake', type: 'chiffon' }, amount: 10 }, - { - _id: 2, - item: { category: 'cookies', type: 'chocolate chip' }, - amount: 50 - }, - { - _id: 3, - item: { category: 'cookies', type: 'chocolate chip' }, - amount: 15 - }, - { _id: 4, item: { category: 'cake', type: 'lemon' }, amount: 30 }, - { _id: 5, item: { category: 'cake', type: 'carrot' }, amount: 20 }, - { _id: 6, item: { category: 'brownies', type: 'blondie' }, amount: 10 } - ] - }) - - it('straight test', () => { - const sort = sorter({ - amount: -1 - }) - - assert.deepStrictEqual(data.sort(sort), [ - { - _id: 2, - item: { category: 'cookies', type: 'chocolate chip' }, - amount: 50 - }, - { _id: 4, item: { category: 'cake', type: 'lemon' }, amount: 30 }, - { _id: 5, item: { category: 'cake', type: 'carrot' }, amount: 20 }, - { - _id: 3, - item: { category: 'cookies', type: 'chocolate chip' }, - amount: 15 - }, - { _id: 1, item: { category: 'cake', type: 'chiffon' }, amount: 10 }, - { _id: 6, item: { category: 'brownies', type: 'blondie' }, amount: 10 } - ]) - }) - - it('embedded sort 1', () => { - const sort = sorter({ - 'item.category': 1, - 'item.type': 1 - }) - - assert.deepStrictEqual(data.sort(sort), [ - { _id: 6, item: { category: 'brownies', type: 'blondie' }, amount: 10 }, - { _id: 5, item: { category: 'cake', type: 'carrot' }, amount: 20 }, - { _id: 1, item: { category: 'cake', type: 'chiffon' }, amount: 10 }, - { _id: 4, item: { category: 'cake', type: 'lemon' }, amount: 30 }, - { - _id: 2, - item: { category: 'cookies', type: 'chocolate chip' }, - amount: 50 - }, - { - _id: 3, - item: { category: 'cookies', type: 'chocolate chip' }, - amount: 15 - } - ]) - }) - - it('embedded sort 2', () => { - const sort = sorter({ - 'item.category': 1, - 'item.type': 1, - amount: 1 - }) - - assert.deepStrictEqual(data.sort(sort), [ - { _id: 6, item: { category: 'brownies', type: 'blondie' }, amount: 10 }, - { _id: 5, item: { category: 'cake', type: 'carrot' }, amount: 20 }, - { _id: 1, item: { category: 'cake', type: 'chiffon' }, amount: 10 }, - { _id: 4, item: { category: 'cake', type: 'lemon' }, amount: 30 }, - { - _id: 3, - item: { category: 'cookies', type: 'chocolate chip' }, - amount: 15 - }, - { - _id: 2, - item: { category: 'cookies', type: 'chocolate chip' }, - amount: 50 - } - ]) - }) - - it('embedded sort 3', () => { - const sort = sorter({ - 'item.category': 1, - 'item.type': 1, - amount: -1 - }) - - assert.deepStrictEqual(data.sort(sort), [ - { _id: 6, item: { category: 'brownies', type: 'blondie' }, amount: 10 }, - { _id: 5, item: { category: 'cake', type: 'carrot' }, amount: 20 }, - { _id: 1, item: { category: 'cake', type: 'chiffon' }, amount: 10 }, - { _id: 4, item: { category: 'cake', type: 'lemon' }, amount: 30 }, - { - _id: 2, - item: { category: 'cookies', type: 'chocolate chip' }, - amount: 50 - }, - { - _id: 3, - item: { category: 'cookies', type: 'chocolate chip' }, - amount: 15 - } - ]) - }) - - it('embedded sort 4', () => { - const sort = sorter({ - amount: -1, - 'item.category': 1 - }) - - assert.deepStrictEqual(data.sort(sort), [ - { - _id: 2, - item: { category: 'cookies', type: 'chocolate chip' }, - amount: 50 - }, - { _id: 4, item: { category: 'cake', type: 'lemon' }, amount: 30 }, - { _id: 5, item: { category: 'cake', type: 'carrot' }, amount: 20 }, - { - _id: 3, - item: { category: 'cookies', type: 'chocolate chip' }, - amount: 15 - }, - { _id: 6, item: { category: 'brownies', type: 'blondie' }, amount: 10 }, - { _id: 1, item: { category: 'cake', type: 'chiffon' }, amount: 10 } - ]) - }) - - it('embedded sort 5', () => { - const sort = sorter({ - 'item.category': 1, - amount: 1 - }) - - assert.deepStrictEqual(data.sort(sort), [ - { _id: 6, item: { category: 'brownies', type: 'blondie' }, amount: 10 }, - { _id: 1, item: { category: 'cake', type: 'chiffon' }, amount: 10 }, - { _id: 5, item: { category: 'cake', type: 'carrot' }, amount: 20 }, - { _id: 4, item: { category: 'cake', type: 'lemon' }, amount: 30 }, - { - _id: 3, - item: { category: 'cookies', type: 'chocolate chip' }, - amount: 15 - }, - { - _id: 2, - item: { category: 'cookies', type: 'chocolate chip' }, - amount: 50 - } - ]) - }) - }) -}) diff --git a/packages/adapter-commons/tsconfig.json b/packages/adapter-commons/tsconfig.json deleted file mode 100644 index 316fd41336..0000000000 --- a/packages/adapter-commons/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig", - "include": [ - "src/**/*.ts" - ], - "compilerOptions": { - "outDir": "lib" - } -} diff --git a/packages/adapter-tests/CHANGELOG.md b/packages/adapter-tests/CHANGELOG.md deleted file mode 100644 index 178df23c33..0000000000 --- a/packages/adapter-tests/CHANGELOG.md +++ /dev/null @@ -1,509 +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.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/adapter-tests - -## [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/adapter-tests - -## [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/adapter-tests - -## [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/adapter-tests - -## [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/adapter-tests - -## [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/adapter-tests - -## [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/adapter-tests - -## [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/adapter-tests - -## [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/adapter-tests - -## [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/adapter-tests - -## [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/adapter-tests - -## [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/adapter-tests - -## [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/adapter-tests - -## [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/adapter-tests - -## [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/adapter-tests - -## [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/adapter-tests - -## [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/adapter-tests - -## [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/adapter-tests - -## [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/adapter-tests - -## [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/adapter-tests - -## [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/adapter-tests - -## [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/adapter-tests - -## [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/adapter-tests - -## [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/adapter-tests - -## [5.0.5](https://github.com/feathersjs/feathers/compare/v5.0.4...v5.0.5) (2023-04-28) - -### Bug Fixes - -- **typebox:** Revert to TypeBox 0.25 ([#3183](https://github.com/feathersjs/feathers/issues/3183)) ([cacedf5](https://github.com/feathersjs/feathers/commit/cacedf59e3d2df836777f0cd06ab1b2484ed87c5)) - -## [5.0.4](https://github.com/feathersjs/feathers/compare/v5.0.3...v5.0.4) (2023-04-12) - -### Bug Fixes - -- **adapter-commons:** Support non-default import to ease use with ESM projects ([d06f2cf](https://github.com/feathersjs/feathers/commit/d06f2cfcadda7dc23f0e2bec44f64e6be8500d02)) - -## [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) - -### Bug Fixes - -- **memory/mongodb:** $select as only property & force 'id' in '$select' ([#3081](https://github.com/feathersjs/feathers/issues/3081)) ([fbe3cf5](https://github.com/feathersjs/feathers/commit/fbe3cf5199e102b5aeda2ae33828d5034df3d105)) - -# [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/adapter-tests - -# [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/adapter-tests - -# [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/adapter-tests - -# [5.0.0-pre.36](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.35...v5.0.0-pre.36) (2023-01-29) - -### Bug Fixes - -- **databases:** Improve documentation for adapters and allow dynamic Knex adapter options ([#3019](https://github.com/feathersjs/feathers/issues/3019)) ([66c4b5e](https://github.com/feathersjs/feathers/commit/66c4b5e72000dd03acb57fca1cad4737c85c9c9e)) - -### Features - -- **database:** Add and to the query syntax ([#3021](https://github.com/feathersjs/feathers/issues/3021)) ([00cb0d9](https://github.com/feathersjs/feathers/commit/00cb0d9c302ae951ae007d3d6ceba33e254edd9c)) - -# [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) - -### Features - -- **adapter:** Add patch data type to adapters and refactor AdapterBase usage ([#2906](https://github.com/feathersjs/feathers/issues/2906)) ([9ddc2e6](https://github.com/feathersjs/feathers/commit/9ddc2e6b028f026f939d6af68125847e5c6734b4)) - -# [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/adapter-tests - -# [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/adapter-tests - -# [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 @feathersjs/adapter-tests - -# [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/adapter-tests - -# [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/adapter-tests - -# [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/adapter-tests - -# [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/adapter-tests - -# [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/adapter-tests - -# [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/adapter-tests - -# [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/adapter-tests - -# [5.0.0-pre.20](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.19...v5.0.0-pre.20) (2022-05-04) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -# [5.0.0-pre.19](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.18...v5.0.0-pre.19) (2022-05-01) - -### Bug Fixes - -- **adapter-commons:** Clarify adapter query filtering ([#2607](https://github.com/feathersjs/feathers/issues/2607)) ([2dac771](https://github.com/feathersjs/feathers/commit/2dac771b0a3298d6dd25994d05186701b0617718)) -- **adapter-tests:** Ensure multi tests can run standalone ([#2608](https://github.com/feathersjs/feathers/issues/2608)) ([d7243f2](https://github.com/feathersjs/feathers/commit/d7243f20e84d9dde428ad8dfc7f48388ca569e6e)) - -### BREAKING CHANGES - -- **adapter-commons:** Changes the common adapter base class to use `sanitizeQuery` and `sanitizeData` - -# [5.0.0-pre.18](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.17...v5.0.0-pre.18) (2022-04-11) - -### Bug Fixes - -- **adapter-tests:** Add tests for pagination in multi updates ([#2472](https://github.com/feathersjs/feathers/issues/2472)) ([98a811a](https://github.com/feathersjs/feathers/commit/98a811ac605575ff812a08d0504729a5efe7a69c)) - -# [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/adapter-tests - -# [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/adapter-tests - -# [5.0.0-pre.15](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.14...v5.0.0-pre.15) (2021-11-27) - -### Bug Fixes - -- **typescript:** Overall typing improvements ([#2478](https://github.com/feathersjs/feathers/issues/2478)) ([b8eb804](https://github.com/feathersjs/feathers/commit/b8eb804158556d9651a8607e3c3fda15e0bfd110)) - -# [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/adapter-tests - -# [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/adapter-tests - -# [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/adapter-tests - -# [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/adapter-tests - -# [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/adapter-tests - -# [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/adapter-tests - -# [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/adapter-tests - -# [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/adapter-tests - -# [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/adapter-tests - -# [5.0.0-pre.5](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.4...v5.0.0-pre.5) (2021-06-23) - -### Bug Fixes - -- Update database adapter common repository urls ([#2380](https://github.com/feathersjs/feathers/issues/2380)) ([3f4db68](https://github.com/feathersjs/feathers/commit/3f4db68d6700c7d9023ecd17d0d39893f75a19fd)) - -### Features - -- **adapter-commons:** Add support for params.adapter option and move memory adapter to @feathersjs/memory ([#2367](https://github.com/feathersjs/feathers/issues/2367)) ([a43e7da](https://github.com/feathersjs/feathers/commit/a43e7da22b6b981a96d1321736ea9a0cb924fb4f)) - -# [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/adapter-tests - -# [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/adapter-tests - -# [5.0.0-beta.1](https://github.com/feathersjs/feathers/compare/v5.0.0-beta.0...v5.0.0-beta.1) (2021-04-03) - -### Bug Fixes - -- **adapter-tests:** Add test that verified paginated total ([#2273](https://github.com/feathersjs/feathers/issues/2273)) ([879bd6b](https://github.com/feathersjs/feathers/commit/879bd6b24f42e04eeeeba110ddddda3e1e1dea34)) - -# [5.0.0-beta.0](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.1...v5.0.0-beta.0) (2021-03-28) - -### Features - -- **core:** Remove Uberproto ([#2178](https://github.com/feathersjs/feathers/issues/2178)) ([ddf8821](https://github.com/feathersjs/feathers/commit/ddf8821f53317e6a378657f7d66acb03a037ee47)) - -### BREAKING CHANGES - -- **core:** Services no longer extend Uberproto objects and - `service.mixin()` is no longer available. - -# [5.0.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.5.11...v5.0.0-pre.1) (2020-12-17) - -### Features - -- **memory:** Move feathers-memory into @feathersjs/memory ([#2153](https://github.com/feathersjs/feathers/issues/2153)) ([dd61fe3](https://github.com/feathersjs/feathers/commit/dd61fe371fb0502f78b8ccbe1f45a030e31ecff6)) - -## [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/adapter-tests - -## [4.5.4](https://github.com/feathersjs/feathers/compare/v4.5.3...v4.5.4) (2020-09-27) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -## 4.5.3 (2020-09-24) - -### Bug Fixes - -- **adapter-tests:** Update multi patch + query tests ([#5](https://github.com/feathersjs/databases/issues/5)) ([84f1fe4](https://github.com/feathersjs/databases/commit/84f1fe4f13dc3a26891e43b965f75d08243f6c6f)) - -## [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/adapter-tests - -## [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/adapter-tests - -# [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/adapter-tests - -## [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/adapter-tests - -## [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/adapter-tests - -# [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/adapter-tests - -## [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/adapter-tests - -## [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/adapter-tests - -## [4.3.9](https://github.com/feathersjs/feathers/compare/v4.3.8...v4.3.9) (2019-10-26) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -## [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/adapter-tests - -## [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/adapter-tests - -## [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/adapter-tests - -## [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/adapter-tests - -## [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/adapter-tests - -# [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/adapter-tests - -# [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/adapter-tests - -# [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/adapter-tests - -# [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/adapter-tests - -# [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/adapter-tests - -# [4.0.0-pre.5](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.4...v4.0.0-pre.5) (2019-07-10) - -### Bug Fixes - -- Fix feathers-memory dependency that did not get updated ([9422b13](https://github.com/feathersjs/feathers/commit/9422b13)) - -# [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/adapter-tests - -# [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) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -# [4.0.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.0...v4.0.0-pre.1) (2019-05-08) - -**Note:** Version bump only for package @feathersjs/adapter-tests - -# [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 - -- Add test to make sure different id in adapter query works ([#1165](https://github.com/feathersjs/feathers/issues/1165)) ([0ba4580](https://github.com/feathersjs/feathers/commit/0ba4580)) -- Update adapter tests to not rely on error instance ([#1202](https://github.com/feathersjs/feathers/issues/1202)) ([6885e0e](https://github.com/feathersjs/feathers/commit/6885e0e)) -- Update all dependencies to latest ([#1206](https://github.com/feathersjs/feathers/issues/1206)) ([e51e0f6](https://github.com/feathersjs/feathers/commit/e51e0f6)) - -### chore - -- **package:** Move adapter tests into their own module ([#1164](https://github.com/feathersjs/feathers/issues/1164)) ([dcc1e6b](https://github.com/feathersjs/feathers/commit/dcc1e6b)) - -### 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)) - -### BREAKING CHANGES - -- **package:** Removes adapter tests from @feathersjs/adapter-commons - -## [1.0.1](https://github.com/feathersjs/feathers/compare/@feathersjs/adapter-tests@1.0.0...@feathersjs/adapter-tests@1.0.1) (2019-01-10) - -### Bug Fixes - -- Add test to make sure different id in adapter query works ([#1165](https://github.com/feathersjs/feathers/issues/1165)) ([0ba4580](https://github.com/feathersjs/feathers/commit/0ba4580)) - -# 1.0.0 (2019-01-10) - -### chore - -- **package:** Move adapter tests into their own module ([#1164](https://github.com/feathersjs/feathers/issues/1164)) ([dcc1e6b](https://github.com/feathersjs/feathers/commit/dcc1e6b)) - -### BREAKING CHANGES - -- **package:** Removes adapter tests from @feathersjs/adapter-commons diff --git a/packages/adapter-tests/LICENSE b/packages/adapter-tests/LICENSE deleted file mode 100644 index 7712f870f3..0000000000 --- a/packages/adapter-tests/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2024 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 -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -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 deleted file mode 100644 index ebbe6fddc2..0000000000 --- a/packages/adapter-tests/README.md +++ /dev/null @@ -1,21 +0,0 @@ -# Feathers Adapter Tests - -[![CI](https://github.com/feathersjs/feathers/workflows/Node.js%20CI/badge.svg)](https://github.com/feathersjs/feathers/actions?query=workflow%3A%22Node.js+CI%22) -[![Download Status](https://img.shields.io/npm/dm/@feathersjs/adapter-commons.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/adapter-commons) -[![Discord](https://badgen.net/badge/icon/discord?icon=discord&label)](https://discord.gg/qa8kez8QBx) - -> Feathers shared database adapter test suite - -## About - -This is a repository that contains the test suite for the common database adapter syntax. See the [API documentation](https://docs.feathersjs.com/api/databases/common.html) for more information. - -## Authors - -[Feathers contributors](https://github.com/feathersjs/adapter-tests/graphs/contributors) - -## License - -Copyright (c) 2024 [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 deleted file mode 100644 index 7af3b02f5b..0000000000 --- a/packages/adapter-tests/package.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "name": "@feathersjs/adapter-tests", - "version": "5.0.34", - "description": "Feathers shared database adapter test suite", - "homepage": "https://feathersjs.com", - "keywords": [ - "feathers" - ], - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/feathers" - }, - "repository": { - "type": "git", - "url": "git://github.com/feathersjs/feathers.git", - "directory": "packages/adapter-tests" - }, - "author": { - "name": "Feathers contributor", - "email": "hello@feathersjs.com", - "url": "https://feathersjs.com" - }, - "contributors": [], - "bugs": { - "url": "https://github.com/feathersjs/feathers/issues" - }, - "engines": { - "node": ">= 12" - }, - "main": "lib/", - "types": "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" - }, - "directories": { - "lib": "lib" - }, - "files": [ - "CHANGELOG.md", - "LICENSE", - "README.md", - "src/**", - "lib/**" - ], - "publishConfig": { - "access": "public" - }, - "devDependencies": { - "@types/mocha": "^10.0.10", - "@types/node": "^24.1.0", - "mocha": "^11.7.1", - "shx": "^0.4.0", - "ts-node": "^10.9.2", - "typescript": "^5.9.2" - }, - "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" -} diff --git a/packages/adapter-tests/src/basic.ts b/packages/adapter-tests/src/basic.ts deleted file mode 100644 index c19ad64a76..0000000000 --- a/packages/adapter-tests/src/basic.ts +++ /dev/null @@ -1,50 +0,0 @@ -import assert from 'assert' -import { AdapterBasicTest } from './declarations' - -export default (test: AdapterBasicTest, app: any, _errors: any, serviceName: string, idProp: string) => { - describe('Basic Functionality', () => { - let service: any - - beforeEach(() => { - service = app.service(serviceName) - }) - - it('.id', () => { - assert.strictEqual(service.id, idProp, 'id property is set to expected name') - }) - - test('.options', () => { - assert.ok(service.options, 'Options are available in service.options') - }) - - test('.events', () => { - assert.ok(service.events.includes('testing'), 'service.events is set and includes "testing"') - }) - - describe('Raw Methods', () => { - test('._get', () => { - assert.strictEqual(typeof service._get, 'function') - }) - - test('._find', () => { - assert.strictEqual(typeof service._find, 'function') - }) - - test('._create', () => { - assert.strictEqual(typeof service._create, 'function') - }) - - test('._update', () => { - assert.strictEqual(typeof service._update, 'function') - }) - - test('._patch', () => { - assert.strictEqual(typeof service._patch, 'function') - }) - - test('._remove', () => { - assert.strictEqual(typeof service._remove, 'function') - }) - }) - }) -} diff --git a/packages/adapter-tests/src/declarations.ts b/packages/adapter-tests/src/declarations.ts deleted file mode 100644 index 1674ced7bd..0000000000 --- a/packages/adapter-tests/src/declarations.ts +++ /dev/null @@ -1,98 +0,0 @@ -export type AdapterTest = (name: AdapterTestName, runner: any) => void - -export type AdapterBasicTest = (name: AdapterBasicTestName, runner: any) => void -export type AdapterMethodsTest = (name: AdapterMethodsTestName, runner: any) => void -export type AdapterSyntaxTest = (name: AdapterSyntaxTestName, runner: any) => void - -export type AdapterTestName = AdapterBasicTestName | AdapterMethodsTestName | AdapterSyntaxTestName - -export type AdapterBasicTestName = - | '.id' - | '.options' - | '.events' - | '._get' - | '._find' - | '._create' - | '._update' - | '._patch' - | '._remove' - | '.$get' - | '.$find' - | '.$create' - | '.$update' - | '.$patch' - | '.$remove' - -export type AdapterMethodsTestName = - | '.get' - | '.get + $select' - | '.get + id + query' - | '.get + NotFound' - | '.get + NotFound (integer)' - | '.get + id + query id' - | '.find' - | '.remove' - | '.remove + $select' - | '.remove + id + query' - | '.remove + NotFound' - | '.remove + NotFound (integer)' - | '.remove + multi' - | '.remove + multi no pagination' - | '.remove + id + query id' - | '.update' - | '.update + $select' - | '.update + id + query' - | '.update + NotFound' - | '.update + NotFound (integer)' - | '.update + query + NotFound' - | '.update + id + query id' - | '.patch' - | '.patch + $select' - | '.patch + id + query' - | '.patch multiple' - | '.patch multiple no pagination' - | '.patch multi query same' - | '.patch multi query changed' - | '.patch + NotFound' - | '.patch + NotFound (integer)' - | '.patch + query + NotFound' - | '.patch + id + query id' - | '.create' - | '.create + $select' - | '.create multi' - | '.create ignores query' - | 'internal .find' - | 'internal .get' - | 'internal .create' - | 'internal .update' - | 'internal .patch' - | 'internal .remove' - -export type AdapterSyntaxTestName = - | '.find + equal' - | '.find + equal multiple' - | '.find + $sort' - | '.find + $sort + string' - | '.find + $limit' - | '.find + $limit 0' - | '.find + $skip' - | '.find + $select' - | '.find + $or' - | '.find + $in' - | '.find + $nin' - | '.find + $lt' - | '.find + $lte' - | '.find + $gt' - | '.find + $gte' - | '.find + $ne' - | '.find + $gt + $lt + $sort' - | '.find + $or nested + $sort' - | '.find + $and' - | '.find + $and + $or' - | 'params.adapter + paginate' - | 'params.adapter + multi' - | '.find + paginate' - | '.find + paginate + query' - | '.find + paginate + $limit + $skip' - | '.find + paginate + $limit 0' - | '.find + paginate + params' diff --git a/packages/adapter-tests/src/index.ts b/packages/adapter-tests/src/index.ts deleted file mode 100644 index 9a86033698..0000000000 --- a/packages/adapter-tests/src/index.ts +++ /dev/null @@ -1,57 +0,0 @@ -/* eslint-disable no-console */ -import basicTests from './basic' -import { AdapterTestName } from './declarations' -import methodTests from './methods' -import syntaxTests from './syntax' - -export const adapterTests = (testNames: AdapterTestName[]) => { - return (app: any, errors: any, serviceName: any, idProp = 'id') => { - if (!serviceName) { - throw new Error('You must pass a service name') - } - - const skippedTests: AdapterTestName[] = [] - const allTests: AdapterTestName[] = [] - - const test = (name: AdapterTestName, runner: any) => { - const skip = !testNames.includes(name) - const its = skip ? it.skip : it - - if (skip) { - skippedTests.push(name) - } - - allTests.push(name) - - its(name, runner) - } - - describe(`Adapter tests for '${serviceName}' service with '${idProp}' id property`, () => { - after(() => { - testNames.forEach((name) => { - if (!allTests.includes(name)) { - console.error(`WARNING: '${name}' test is not part of the test suite`) - } - }) - if (skippedTests.length) { - console.log( - `\nSkipped the following ${skippedTests.length} Feathers adapter test(s) out of ${allTests.length} total:` - ) - console.log(JSON.stringify(skippedTests, null, ' ')) - } - }) - - basicTests(test, app, errors, serviceName, idProp) - methodTests(test, app, errors, serviceName, idProp) - syntaxTests(test, app, errors, serviceName, idProp) - }) - } -} - -export * from './declarations' - -export default adapterTests - -if (typeof module !== 'undefined') { - module.exports = Object.assign(adapterTests, module.exports) -} diff --git a/packages/adapter-tests/src/methods.ts b/packages/adapter-tests/src/methods.ts deleted file mode 100644 index 84d6c3f18f..0000000000 --- a/packages/adapter-tests/src/methods.ts +++ /dev/null @@ -1,773 +0,0 @@ -import assert from 'assert' -import { AdapterMethodsTest } from './declarations' - -export default (test: AdapterMethodsTest, app: any, _errors: any, serviceName: string, idProp: string) => { - describe(' Methods', () => { - let doug: any - let service: any - - beforeEach(async () => { - service = app.service(serviceName) - doug = await app.service(serviceName).create({ - name: 'Doug', - age: 32 - }) - }) - - afterEach(async () => { - try { - await app.service(serviceName).remove(doug[idProp]) - } catch (error: any) {} - }) - - describe('get', () => { - test('.get', async () => { - const data = await service.get(doug[idProp]) - - assert.strictEqual(data[idProp].toString(), doug[idProp].toString(), `${idProp} id matches`) - assert.strictEqual(data.name, 'Doug', 'data.name matches') - assert.strictEqual(data.age, 32, 'data.age matches') - }) - - test('.get + $select', async () => { - const data = await service.get(doug[idProp], { - query: { $select: ['name'] } - }) - - assert.strictEqual(data[idProp].toString(), doug[idProp].toString(), `${idProp} id property matches`) - assert.strictEqual(data.name, 'Doug', 'data.name matches') - assert.ok(!data.age, 'data.age is falsy') - }) - - test('.get + id + query', async () => { - try { - await service.get(doug[idProp], { - query: { name: 'Tester' } - }) - throw new Error('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotFound', 'Got a NotFound Feathers error') - } - }) - - test('.get + NotFound', async () => { - try { - await service.get('568225fbfe21222432e836ff') - throw new Error('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotFound', 'Error is a NotFound Feathers error') - } - }) - - test('.get + NotFound (integer)', async () => { - try { - await service.get(123456789) - throw new Error('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotFound', 'Error is a NotFound Feathers error') - } - }) - - test('.get + id + query id', async () => { - const alice = await service.create({ - name: 'Alice', - age: 12 - }) - - try { - await service.get(doug[idProp], { - query: { [idProp]: alice[idProp] } - }) - throw new Error('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotFound', 'Got a NotFound Feathers error') - } - - await service.remove(alice[idProp]) - }) - }) - - describe('find', () => { - test('.find', async () => { - const data = await service.find() - - assert.ok(Array.isArray(data), 'Data is an array') - assert.strictEqual(data.length, 1, 'Got one entry') - }) - }) - - describe('remove', () => { - test('.remove', async () => { - const data = await service.remove(doug[idProp]) - - assert.strictEqual(data.name, 'Doug', 'data.name matches') - }) - - test('.remove + $select', async () => { - const data = await service.remove(doug[idProp], { - query: { $select: ['name'] } - }) - - assert.strictEqual(data[idProp].toString(), doug[idProp].toString(), `${idProp} id property matches`) - assert.strictEqual(data.name, 'Doug', 'data.name matches') - assert.ok(!data.age, 'data.age is falsy') - }) - - test('.remove + id + query', async () => { - try { - await service.remove(doug[idProp], { - query: { name: 'Tester' } - }) - throw new Error('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotFound', 'Got a NotFound Feathers error') - } - }) - - test('.remove + NotFound', async () => { - try { - await service.remove('568225fbfe21222432e836ff') - throw new Error('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotFound', 'Error is a NotFound Feathers error') - } - }) - - test('.remove + NotFound (integer)', async () => { - try { - await service.remove(123456789) - throw new Error('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotFound', 'Error is a NotFound Feathers error') - } - }) - - test('.remove + multi', async () => { - try { - await service.remove(null) - throw new Error('Should never get here') - } catch (error: any) { - assert.strictEqual( - error.name, - 'MethodNotAllowed', - 'Removing multiple without option set throws MethodNotAllowed' - ) - } - - service.options.multi = ['remove'] - - await service.create({ name: 'Dave', age: 29, created: true }) - await service.create({ - name: 'David', - age: 3, - created: true - }) - - const data = await service.remove(null, { - query: { created: true } - }) - - assert.strictEqual(data.length, 2) - - const names = data.map((person: any) => person.name) - - assert.ok(names.includes('Dave'), 'Dave removed') - assert.ok(names.includes('David'), 'David removed') - }) - - test('.remove + multi no pagination', async () => { - try { - await service.remove(doug[idProp]) - } catch (error: any) {} - - const count = 14 - const defaultPaginate = 10 - - assert.ok(count > defaultPaginate, 'count is bigger than default pagination') - - const multiBefore = service.options.multi - const paginateBefore = service.options.paginate - - try { - service.options.multi = true - service.options.paginate = { - default: defaultPaginate, - max: 100 - } - - const emptyItems = await service.find({ paginate: false }) - assert.strictEqual(emptyItems.length, 0, 'no items before') - - const createdItems = await service.create( - Array.from(Array(count)).map((_, i) => ({ - name: `name-${i}`, - age: 3, - created: true - })) - ) - assert.strictEqual(createdItems.length, count, `created ${count} items`) - - const foundItems = await service.find({ paginate: false }) - assert.strictEqual(foundItems.length, count, `created ${count} items`) - - const foundPaginatedItems = await service.find({}) - assert.strictEqual(foundPaginatedItems.data.length, defaultPaginate, 'found paginated items') - - const allItems = await service.remove(null, { - query: { created: true } - }) - - assert.strictEqual(allItems.length, count, `removed all ${count} items`) - } finally { - await service.remove(null, { - query: { created: true }, - paginate: false - }) - - service.options.multi = multiBefore - service.options.paginate = paginateBefore - } - }) - - test('.remove + id + query id', async () => { - const alice = await service.create({ - name: 'Alice', - age: 12 - }) - - try { - await service.remove(doug[idProp], { - query: { [idProp]: alice[idProp] } - }) - throw new Error('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotFound', 'Got a NotFound Feathers error') - } - - await service.remove(alice[idProp]) - }) - }) - - describe('update', () => { - test('.update', async () => { - const originalData = { [idProp]: doug[idProp], name: 'Dougler' } - const originalCopy = Object.assign({}, originalData) - - const data = await service.update(doug[idProp], originalData) - - assert.deepStrictEqual(originalData, originalCopy, 'data was not modified') - assert.strictEqual(data[idProp].toString(), doug[idProp].toString(), `${idProp} id matches`) - assert.strictEqual(data.name, 'Dougler', 'data.name matches') - assert.ok(!data.age, 'data.age is falsy') - }) - - test('.update + $select', async () => { - const originalData = { - [idProp]: doug[idProp], - name: 'Dougler', - age: 10 - } - - const data = await service.update(doug[idProp], originalData, { - query: { $select: ['name'] } - }) - - assert.strictEqual(data[idProp].toString(), doug[idProp].toString(), `${idProp} id property matches`) - assert.strictEqual(data.name, 'Dougler', 'data.name matches') - assert.ok(!data.age, 'data.age is falsy') - }) - - test('.update + id + query', async () => { - try { - await service.update( - doug[idProp], - { - name: 'Dougler' - }, - { - query: { name: 'Tester' } - } - ) - throw new Error('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotFound', 'Got a NotFound Feathers error') - } - }) - - test('.update + NotFound', async () => { - try { - await service.update('568225fbfe21222432e836ff', { - name: 'NotFound' - }) - throw new Error('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotFound', 'Error is a NotFound Feathers error') - } - }) - - test('.update + NotFound (integer)', async () => { - try { - await service.update(123456789, { - name: 'NotFound' - }) - throw new Error('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotFound', 'Error is a NotFound Feathers error') - } - }) - - test('.update + query + NotFound', async () => { - const dave = await service.create({ name: 'Dave' }) - try { - await service.update(dave[idProp], { name: 'UpdatedDave' }, { query: { name: 'NotDave' } }) - throw new Error('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotFound', 'Error is a NotFound Feathers error') - } - await service.remove(dave[idProp]) - }) - - test('.update + id + query id', async () => { - const alice = await service.create({ - name: 'Alice', - age: 12 - }) - - try { - await service.update( - doug[idProp], - { - name: 'Dougler', - age: 33 - }, - { - query: { [idProp]: alice[idProp] } - } - ) - throw new Error('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotFound', 'Got a NotFound Feathers error') - } - - await service.remove(alice[idProp]) - }) - }) - - describe('patch', () => { - test('.patch', async () => { - const originalData = { [idProp]: doug[idProp], name: 'PatchDoug' } - const originalCopy = Object.assign({}, originalData) - - const data = await service.patch(doug[idProp], originalData) - - assert.deepStrictEqual(originalData, originalCopy, 'original data was not modified') - assert.strictEqual(data[idProp].toString(), doug[idProp].toString(), `${idProp} id matches`) - assert.strictEqual(data.name, 'PatchDoug', 'data.name matches') - assert.strictEqual(data.age, 32, 'data.age matches') - }) - - test('.patch + $select', async () => { - const originalData = { [idProp]: doug[idProp], name: 'PatchDoug' } - - const data = await service.patch(doug[idProp], originalData, { - query: { $select: ['name'] } - }) - - assert.strictEqual(data[idProp].toString(), doug[idProp].toString(), `${idProp} id property matches`) - assert.strictEqual(data.name, 'PatchDoug', 'data.name matches') - assert.ok(!data.age, 'data.age is falsy') - }) - - test('.patch + id + query', async () => { - try { - await service.patch( - doug[idProp], - { - name: 'id patched doug' - }, - { - query: { name: 'Tester' } - } - ) - throw new Error('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotFound', 'Got a NotFound Feathers error') - } - }) - - test('.patch multiple', async () => { - try { - await service.patch(null, {}) - throw new Error('Should never get here') - } catch (error: any) { - assert.strictEqual( - error.name, - 'MethodNotAllowed', - 'Removing multiple without option set throws MethodNotAllowed' - ) - } - - const params = { - query: { created: true } - } - const dave = await service.create({ - name: 'Dave', - age: 29, - created: true - }) - const david = await service.create({ - name: 'David', - age: 3, - created: true - }) - - service.options.multi = ['patch'] - - const data = await service.patch( - null, - { - age: 2 - }, - params - ) - - assert.strictEqual(data.length, 2, 'returned two entries') - assert.strictEqual(data[0].age, 2, 'First entry age was updated') - assert.strictEqual(data[1].age, 2, 'Second entry age was updated') - - await service.remove(dave[idProp]) - await service.remove(david[idProp]) - }) - - test('.patch multiple no pagination', async () => { - try { - await service.remove(doug[idProp]) - } catch (error: any) {} - - const count = 14 - const defaultPaginate = 10 - - assert.ok(count > defaultPaginate, 'count is bigger than default pagination') - - const multiBefore = service.options.multi - const paginateBefore = service.options.paginate - - let ids: any[] - - try { - service.options.multi = true - service.options.paginate = { - default: defaultPaginate, - max: 100 - } - - const emptyItems = await service.find({ paginate: false }) - assert.strictEqual(emptyItems.length, 0, 'no items before') - - const createdItems = await service.create( - Array.from(Array(count)).map((_, i) => ({ - name: `name-${i}`, - age: 3, - created: true - })) - ) - assert.strictEqual(createdItems.length, count, `created ${count} items`) - ids = createdItems.map((item: any) => item[idProp]) - - const foundItems = await service.find({ paginate: false }) - assert.strictEqual(foundItems.length, count, `created ${count} items`) - - const foundPaginatedItems = await service.find({}) - assert.strictEqual(foundPaginatedItems.data.length, defaultPaginate, 'found paginated data') - - const allItems = await service.patch(null, { age: 4 }, { query: { created: true } }) - - assert.strictEqual(allItems.length, count, `patched all ${count} items`) - } finally { - service.options.multi = multiBefore - service.options.paginate = paginateBefore - if (ids) { - await Promise.all(ids.map((id) => service.remove(id))) - } - } - }) - - test('.patch multi query same', async () => { - const service = app.service(serviceName) - const multiBefore = service.options.multi - - service.options.multi = true - - const params = { - query: { age: { $lt: 10 } } - } - const dave = await service.create({ - name: 'Dave', - age: 8, - created: true - }) - const david = await service.create({ - name: 'David', - age: 4, - created: true - }) - - const data = await service.patch( - null, - { - age: 2 - }, - params - ) - - assert.strictEqual(data.length, 2, 'returned two entries') - assert.strictEqual(data[0].age, 2, 'First entry age was updated') - assert.strictEqual(data[1].age, 2, 'Second entry age was updated') - - await service.remove(dave[idProp]) - await service.remove(david[idProp]) - - service.options.multi = multiBefore - }) - - test('.patch multi query changed', async () => { - const service = app.service(serviceName) - const multiBefore = service.options.multi - - service.options.multi = true - - const params = { - query: { age: 10 } - } - const dave = await service.create({ - name: 'Dave', - age: 10, - created: true - }) - const david = await service.create({ - name: 'David', - age: 10, - created: true - }) - - const data = await service.patch( - null, - { - age: 2 - }, - params - ) - - assert.strictEqual(data.length, 2, 'returned two entries') - assert.strictEqual(data[0].age, 2, 'First entry age was updated') - assert.strictEqual(data[1].age, 2, 'Second entry age was updated') - - await service.remove(dave[idProp]) - await service.remove(david[idProp]) - - service.options.multi = multiBefore - }) - - test('.patch + NotFound', async () => { - try { - await service.patch('568225fbfe21222432e836ff', { - name: 'PatchDoug' - }) - throw new Error('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotFound', 'Error is a NotFound Feathers error') - } - }) - - test('.patch + NotFound (integer)', async () => { - try { - await service.patch(123456789, { - name: 'PatchDoug' - }) - throw new Error('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotFound', 'Error is a NotFound Feathers error') - } - }) - - test('.patch + query + NotFound', async () => { - const dave = await service.create({ name: 'Dave' }) - try { - await service.patch(dave[idProp], { name: 'PatchedDave' }, { query: { name: 'NotDave' } }) - throw new Error('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotFound', 'Error is a NotFound Feathers error') - } - await service.remove(dave[idProp]) - }) - - test('.patch + id + query id', async () => { - const alice = await service.create({ - name: 'Alice', - age: 12 - }) - - try { - await service.patch( - doug[idProp], - { - age: 33 - }, - { - query: { [idProp]: alice[idProp] } - } - ) - throw new Error('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotFound', 'Got a NotFound Feathers error') - } - - await service.remove(alice[idProp]) - }) - }) - - describe('create', () => { - test('.create', async () => { - const originalData = { - name: 'Bill', - age: 40 - } - const originalCopy = Object.assign({}, originalData) - - const data = await service.create(originalData) - - assert.deepStrictEqual(originalData, originalCopy, 'original data was not modified') - assert.ok(data instanceof Object, 'data is an object') - assert.strictEqual(data.name, 'Bill', 'data.name matches') - - await service.remove(data[idProp]) - }) - - test('.create ignores query', async () => { - const originalData = { - name: 'Billy', - age: 42 - } - const data = await service.create(originalData, { - query: { - name: 'Dave' - } - }) - - assert.strictEqual(data.name, 'Billy', 'data.name matches') - - await service.remove(data[idProp]) - }) - - test('.create + $select', async () => { - const originalData = { - name: 'William', - age: 23 - } - - const data = await service.create(originalData, { - query: { $select: ['name'] } - }) - - assert.ok(idProp in data, 'data has id') - assert.strictEqual(data.name, 'William', 'data.name matches') - assert.ok(!data.age, 'data.age is falsy') - - await service.remove(data[idProp]) - }) - - test('.create multi', async () => { - try { - await service.create([], {}) - throw new Error('Should never get here') - } catch (error: any) { - assert.strictEqual( - error.name, - 'MethodNotAllowed', - 'Removing multiple without option set throws MethodNotAllowed' - ) - } - - const items = [ - { - name: 'Gerald', - age: 18 - }, - { - name: 'Herald', - age: 18 - } - ] - - service.options.multi = ['create', 'patch'] - - const data = await service.create(items) - - assert.ok(Array.isArray(data), 'data is an array') - assert.ok(typeof data[0][idProp] !== 'undefined', 'id is set') - assert.strictEqual(data[0].name, 'Gerald', 'first name matches') - assert.ok(typeof data[1][idProp] !== 'undefined', 'id is set') - assert.strictEqual(data[1].name, 'Herald', 'second name macthes') - - await service.remove(data[0][idProp]) - await service.remove(data[1][idProp]) - }) - }) - - describe("doesn't call public methods internally", () => { - let throwing: any - - before(() => { - throwing = Object.assign(Object.create(app.service(serviceName)), { - get store() { - return app.service(serviceName).store - }, - - find() { - throw new Error('find method called') - }, - get() { - throw new Error('get method called') - }, - create() { - throw new Error('create method called') - }, - update() { - throw new Error('update method called') - }, - patch() { - throw new Error('patch method called') - }, - remove() { - throw new Error('remove method called') - } - }) - }) - - test('internal .find', () => app.service(serviceName).find.call(throwing)) - - test('internal .get', () => service.get.call(throwing, doug[idProp])) - - test('internal .create', async () => { - const bob = await service.create.call(throwing, { - name: 'Bob', - age: 25 - }) - - await service.remove(bob[idProp]) - }) - - test('internal .update', () => - service.update.call(throwing, doug[idProp], { - name: 'Dougler' - })) - - test('internal .patch', () => - service.patch.call(throwing, doug[idProp], { - name: 'PatchDoug' - })) - - test('internal .remove', () => service.remove.call(throwing, doug[idProp])) - }) - }) -} diff --git a/packages/adapter-tests/src/syntax.ts b/packages/adapter-tests/src/syntax.ts deleted file mode 100644 index e559d394c2..0000000000 --- a/packages/adapter-tests/src/syntax.ts +++ /dev/null @@ -1,423 +0,0 @@ -import assert from 'assert' -import { AdapterSyntaxTest } from './declarations' - -export default (test: AdapterSyntaxTest, app: any, _errors: any, serviceName: string, idProp: string) => { - describe('Query Syntax', () => { - let bob: any - let alice: any - let doug: any - let service: any - - beforeEach(async () => { - service = app.service(serviceName) - bob = await app.service(serviceName).create({ - name: 'Bob', - age: 25 - }) - doug = await app.service(serviceName).create({ - name: 'Doug', - age: 32 - }) - alice = await app.service(serviceName).create({ - name: 'Alice', - age: 19 - }) - }) - - afterEach(async () => { - await service.remove(bob[idProp]) - await service.remove(alice[idProp]) - await service.remove(doug[idProp]) - }) - - test('.find + equal', async () => { - const params = { query: { name: 'Alice' } } - const data = await service.find(params) - - assert.ok(Array.isArray(data)) - assert.strictEqual(data.length, 1) - assert.strictEqual(data[0].name, 'Alice') - }) - - test('.find + equal multiple', async () => { - const data = await service.find({ - query: { name: 'Alice', age: 20 } - }) - - assert.strictEqual(data.length, 0) - }) - - describe('special filters', () => { - test('.find + $sort', async () => { - let data = await service.find({ - query: { - $sort: { name: 1 } - } - }) - - assert.strictEqual(data.length, 3) - assert.strictEqual(data[0].name, 'Alice') - assert.strictEqual(data[1].name, 'Bob') - assert.strictEqual(data[2].name, 'Doug') - - data = await service.find({ - query: { - $sort: { name: -1 } - } - }) - - assert.strictEqual(data.length, 3) - assert.strictEqual(data[0].name, 'Doug') - assert.strictEqual(data[1].name, 'Bob') - assert.strictEqual(data[2].name, 'Alice') - }) - - test('.find + $sort + string', async () => { - const data = await service.find({ - query: { - $sort: { name: '1' } - } - }) - - assert.strictEqual(data.length, 3) - assert.strictEqual(data[0].name, 'Alice') - assert.strictEqual(data[1].name, 'Bob') - assert.strictEqual(data[2].name, 'Doug') - }) - - test('.find + $limit', async () => { - const data = await service.find({ - query: { - $limit: 2 - } - }) - - assert.strictEqual(data.length, 2) - }) - - test('.find + $limit 0', async () => { - const data = await service.find({ - query: { - $limit: 0 - } - }) - - assert.strictEqual(data.length, 0) - }) - - test('.find + $skip', async () => { - const data = await service.find({ - query: { - $sort: { name: 1 }, - $skip: 1 - } - }) - - assert.strictEqual(data.length, 2) - assert.strictEqual(data[0].name, 'Bob') - assert.strictEqual(data[1].name, 'Doug') - }) - - test('.find + $select', async () => { - const data = await service.find({ - query: { - name: 'Alice', - $select: ['name'] - } - }) - - assert.strictEqual(data.length, 1) - assert.ok(idProp in data[0], 'data has id') - assert.strictEqual(data[0].name, 'Alice') - assert.strictEqual(data[0].age, undefined) - }) - - test('.find + $or', async () => { - const data = await service.find({ - query: { - $or: [{ name: 'Alice' }, { name: 'Bob' }], - $sort: { name: 1 } - } - }) - - assert.strictEqual(data.length, 2) - assert.strictEqual(data[0].name, 'Alice') - assert.strictEqual(data[1].name, 'Bob') - }) - - test('.find + $in', async () => { - const data = await service.find({ - query: { - name: { - $in: ['Alice', 'Bob'] - }, - $sort: { name: 1 } - } - }) - - assert.strictEqual(data.length, 2) - assert.strictEqual(data[0].name, 'Alice') - assert.strictEqual(data[1].name, 'Bob') - }) - - test('.find + $nin', async () => { - const data = await service.find({ - query: { - name: { - $nin: ['Alice', 'Bob'] - } - } - }) - - assert.strictEqual(data.length, 1) - assert.strictEqual(data[0].name, 'Doug') - }) - - test('.find + $lt', async () => { - const data = await service.find({ - query: { - age: { - $lt: 30 - } - } - }) - - assert.strictEqual(data.length, 2) - }) - - test('.find + $lte', async () => { - const data = await service.find({ - query: { - age: { - $lte: 25 - } - } - }) - - assert.strictEqual(data.length, 2) - }) - - test('.find + $gt', async () => { - const data = await service.find({ - query: { - age: { - $gt: 30 - } - } - }) - - assert.strictEqual(data.length, 1) - }) - - test('.find + $gte', async () => { - const data = await service.find({ - query: { - age: { - $gte: 25 - } - } - }) - - assert.strictEqual(data.length, 2) - }) - - test('.find + $ne', async () => { - const data = await service.find({ - query: { - age: { - $ne: 25 - } - } - }) - - assert.strictEqual(data.length, 2) - }) - }) - - test('.find + $gt + $lt + $sort', async () => { - const params = { - query: { - age: { - $gt: 18, - $lt: 30 - }, - $sort: { name: 1 } - } - } - - const data = await service.find(params) - - assert.strictEqual(data.length, 2) - assert.strictEqual(data[0].name, 'Alice') - assert.strictEqual(data[1].name, 'Bob') - }) - - test('.find + $or nested + $sort', async () => { - const params = { - query: { - $or: [ - { name: 'Doug' }, - { - age: { - $gte: 18, - $lt: 25 - } - } - ], - $sort: { name: 1 } - } - } - - const data = await service.find(params) - - assert.strictEqual(data.length, 2) - assert.strictEqual(data[0].name, 'Alice') - assert.strictEqual(data[1].name, 'Doug') - }) - - test('.find + $and', async () => { - const params = { - query: { - $and: [{ age: 19 }], - $sort: { name: 1 } - } - } - - const data = await service.find(params) - - assert.strictEqual(data.length, 1) - assert.strictEqual(data[0].name, 'Alice') - }) - - test('.find + $and + $or', async () => { - const params = { - query: { - $and: [{ $or: [{ name: 'Alice' }] }], - $sort: { name: 1 } - } - } - - const data = await service.find(params) - - assert.strictEqual(data.length, 1) - assert.strictEqual(data[0].name, 'Alice') - }) - - describe('params.adapter', () => { - test('params.adapter + paginate', async () => { - const page = await service.find({ - adapter: { - paginate: { default: 3 } - } - }) - - assert.strictEqual(page.limit, 3) - assert.strictEqual(page.skip, 0) - }) - - test('params.adapter + multi', async () => { - const items = [ - { - name: 'Garald', - age: 200 - }, - { - name: 'Harald', - age: 24 - } - ] - const multiParams = { - adapter: { - multi: ['create'] - } - } - const users = await service.create(items, multiParams) - - assert.strictEqual(users.length, 2) - - await service.remove(users[0][idProp]) - await service.remove(users[1][idProp]) - await assert.rejects(() => service.patch(null, { age: 2 }, multiParams), { - message: 'Can not patch multiple entries' - }) - }) - }) - - describe('paginate', function () { - beforeEach(() => { - service.options.paginate = { - default: 1, - max: 2 - } - }) - - afterEach(() => { - service.options.paginate = {} - }) - - test('.find + paginate', async () => { - const page = await service.find({ - query: { $sort: { name: -1 } } - }) - - assert.strictEqual(page.total, 3) - assert.strictEqual(page.limit, 1) - assert.strictEqual(page.skip, 0) - assert.strictEqual(page.data[0].name, 'Doug') - }) - - test('.find + paginate + query', async () => { - const page = await service.find({ - query: { - $sort: { name: -1 }, - name: 'Doug' - } - }) - - assert.strictEqual(page.total, 1) - assert.strictEqual(page.limit, 1) - assert.strictEqual(page.skip, 0) - assert.strictEqual(page.data[0].name, 'Doug') - }) - - test('.find + paginate + $limit + $skip', async () => { - const params = { - query: { - $skip: 1, - $limit: 4, - $sort: { name: -1 } - } - } - - const page = await service.find(params) - - assert.strictEqual(page.total, 3) - assert.strictEqual(page.limit, 2) - assert.strictEqual(page.skip, 1) - assert.strictEqual(page.data[0].name, 'Bob') - assert.strictEqual(page.data[1].name, 'Alice') - }) - - test('.find + paginate + $limit 0', async () => { - const page = await service.find({ - query: { $limit: 0 } - }) - - assert.strictEqual(page.total, 3) - assert.strictEqual(page.data.length, 0) - }) - - test('.find + paginate + params', async () => { - const page = await service.find({ paginate: { default: 3 } }) - - assert.strictEqual(page.limit, 3) - assert.strictEqual(page.skip, 0) - - const results = await service.find({ paginate: false }) - - assert.ok(Array.isArray(results)) - assert.strictEqual(results.length, 3) - }) - }) - }) -} diff --git a/packages/adapter-tests/test/index.test.ts b/packages/adapter-tests/test/index.test.ts deleted file mode 100644 index fc4a3ad0ec..0000000000 --- a/packages/adapter-tests/test/index.test.ts +++ /dev/null @@ -1,85 +0,0 @@ -import { strict as assert } from 'assert' -import adapterTests from '../src' - -const testSuite = adapterTests([ - '.events', - '._get', - '._find', - '._create', - '._update', - '._patch', - '._remove', - '.$get', - '.$find', - '.$create', - '.$update', - '.$patch', - '.$remove', - '.get', - '.get + $select', - '.get + id + query', - '.get + NotFound', - '.find', - '.remove', - '.remove + $select', - '.remove + id + query', - '.remove + multi', - '.remove + multi no pagination', - '.update', - '.update + $select', - '.update + id + query', - '.update + NotFound', - '.patch', - '.patch + $select', - '.patch + id + query', - '.patch multiple', - '.patch multiple no pagination', - '.patch multi query changed', - '.patch multi query same', - '.patch + NotFound', - '.create', - '.create + $select', - '.create multi', - 'internal .find', - 'internal .get', - 'internal .create', - 'internal .update', - 'internal .patch', - 'internal .remove', - '.find + equal', - '.find + equal multiple', - '.find + $sort', - '.find + $sort + string', - '.find + $limit', - '.find + $limit 0', - '.find + $skip', - '.find + $select', - '.find + $or', - '.find + $in', - '.find + $nin', - '.find + $lt', - '.find + $lte', - '.find + $gt', - '.find + $gte', - '.find + $ne', - '.find + $gt + $lt + $sort', - '.find + $or nested + $sort', - '.find + paginate', - '.find + paginate + $limit + $skip', - '.find + paginate + $limit 0', - '.find + paginate + params', - '.get + id + query id', - '.remove + id + query id', - '.update + id + query id', - '.patch + id + query id' -]) - -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/adapter-tests/tsconfig.json b/packages/adapter-tests/tsconfig.json deleted file mode 100644 index 316fd41336..0000000000 --- a/packages/adapter-tests/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig", - "include": [ - "src/**/*.ts" - ], - "compilerOptions": { - "outDir": "lib" - } -} diff --git a/packages/authentication-client/CHANGELOG.md b/packages/authentication-client/CHANGELOG.md deleted file mode 100644 index 3c6ccb1098..0000000000 --- a/packages/authentication-client/CHANGELOG.md +++ /dev/null @@ -1,869 +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.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/authentication-client - -## [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/authentication-client - -## [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/authentication-client - -## [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/authentication-client - -## [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/authentication-client - -## [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/authentication-client - -## [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/authentication-client - -## [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/authentication-client - -## [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/authentication-client - -## [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/authentication-client - -## [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/authentication-client - -## [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/authentication-client - -## [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/authentication-client - -## [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/authentication-client - -## [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/authentication-client - -## [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/authentication-client - -## [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/authentication-client - -## [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/authentication-client - -## [5.0.12](https://github.com/feathersjs/feathers/compare/v5.0.11...v5.0.12) (2023-11-28) - -### Bug Fixes - -- **authentication-client:** Allow to abort fetch ([#3310](https://github.com/feathersjs/feathers/issues/3310)) ([ff3e104](https://github.com/feathersjs/feathers/commit/ff3e104b62d02d45261a293aff4e9491241f486f)) - -## [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/authentication-client - -## [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/authentication-client - -## [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/authentication-client - -## [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/authentication-client - -## [5.0.6](https://github.com/feathersjs/feathers/compare/v5.0.5...v5.0.6) (2023-06-15) - -### Bug Fixes - -- **authentication-client:** Do not trigger storage methods if storage not defined ([#3210](https://github.com/feathersjs/feathers/issues/3210)) ([261acbc](https://github.com/feathersjs/feathers/commit/261acbcde387db731e434cb106a27b49dcb64a9a)) -- **authentication-client:** removeAccessToken throws error if storage not defined ([#3195](https://github.com/feathersjs/feathers/issues/3195)) ([b8e2769](https://github.com/feathersjs/feathers/commit/b8e27698f7958a91fe9a4ee64ec5591d23194c44)) - -## [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/authentication-client - -## [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.2](https://github.com/feathersjs/feathers/compare/v5.0.1...v5.0.2) (2023-03-23) - -**Note:** Version bump only for package @feathersjs/authentication-client - -## [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/authentication-client - -# [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/authentication-client - -# [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/authentication-client - -# [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/authentication-client - -# [5.0.0-pre.36](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.35...v5.0.0-pre.36) (2023-01-29) - -### Bug Fixes - -- Update all dependencies ([#3024](https://github.com/feathersjs/feathers/issues/3024)) ([283dc47](https://github.com/feathersjs/feathers/commit/283dc4798d85584bc031e6e54b83b4ea77d1edd0)) - -# [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) - -### Bug Fixes - -- **authentication-client:** Do not cache authentication errors ([#2892](https://github.com/feathersjs/feathers/issues/2892)) ([cc4e767](https://github.com/feathersjs/feathers/commit/cc4e76726fce1ac73252cfd92e22570d4bdeca20)) -- **authentication-client:** Improve socket reauthentication handling ([#2895](https://github.com/feathersjs/feathers/issues/2895)) ([9db5e7a](https://github.com/feathersjs/feathers/commit/9db5e7adb0f6aea43d607f530d8258ade98b7362)) -- **authentication-client:** Remove access token for fatal 400 errors ([#2894](https://github.com/feathersjs/feathers/issues/2894)) ([cfc6c7a](https://github.com/feathersjs/feathers/commit/cfc6c7a6b9dbc7fb60816e2b7f15897c38deb98d)) - -# [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/authentication-client - -# [5.0.0-pre.32](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.31...v5.0.0-pre.32) (2022-10-26) - -### Features - -- **cli:** Add authentication client to generated client ([#2801](https://github.com/feathersjs/feathers/issues/2801)) ([bd59f91](https://github.com/feathersjs/feathers/commit/bd59f91b45a01c2eea0c4386e567f4de5aa6ad99)) - -# [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 @feathersjs/authentication-client - -# [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/authentication-client - -# [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 - -- **authentication-client:** Properly handle missing token error ([#2700](https://github.com/feathersjs/feathers/issues/2700)) ([160746e](https://github.com/feathersjs/feathers/commit/160746e2bceb465fd1b6a003415f8ab38daba521)) -- **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) - -### Bug Fixes - -- **authentication-client:** Ensure reAuthenticate works in parallel with other requests ([#2690](https://github.com/feathersjs/feathers/issues/2690)) ([41b3761](https://github.com/feathersjs/feathers/commit/41b376106b47e2f40a8914db7a5ed2935e070c08)) - -# [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/authentication-client - -# [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/authentication-client - -# [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/authentication-client - -# [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/authentication-client - -# [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/authentication-client - -# [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/authentication-client - -# [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/authentication-client - -# [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/authentication-client - -# [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/authentication-client - -# [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/authentication-client - -# [5.0.0-pre.15](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.14...v5.0.0-pre.15) (2021-11-27) - -### Bug Fixes - -- **typescript:** Overall typing improvements ([#2478](https://github.com/feathersjs/feathers/issues/2478)) ([b8eb804](https://github.com/feathersjs/feathers/commit/b8eb804158556d9651a8607e3c3fda15e0bfd110)) - -# [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/authentication-client - -# [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/authentication-client - -# [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/authentication-client - -# [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/authentication-client - -# [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/authentication-client - -# [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/authentication-client - -# [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/authentication-client - -# [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/authentication-client - -# [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/authentication-client - -# [5.0.0-pre.5](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.4...v5.0.0-pre.5) (2021-06-23) - -### Bug Fixes - -- **hooks:** Migrate built-in hooks and allow backwards compatibility ([#2358](https://github.com/feathersjs/feathers/issues/2358)) ([759c5a1](https://github.com/feathersjs/feathers/commit/759c5a19327a731af965c3604119393b3d09a406)) -- **koa:** Use extended query parser for compatibility ([#2397](https://github.com/feathersjs/feathers/issues/2397)) ([b2944ba](https://github.com/feathersjs/feathers/commit/b2944bac3ec6d5ecc80dc518cd4e58093692db74)) - -### Features - -- **adapter-commons:** Add support for params.adapter option and move memory adapter to @feathersjs/memory ([#2367](https://github.com/feathersjs/feathers/issues/2367)) ([a43e7da](https://github.com/feathersjs/feathers/commit/a43e7da22b6b981a96d1321736ea9a0cb924fb4f)) - -# [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/authentication-client - -# [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)) - -### Features - -- **dependencies:** Remove direct debug dependency ([#2296](https://github.com/feathersjs/feathers/issues/2296)) ([501d416](https://github.com/feathersjs/feathers/commit/501d4164d30c6a126906dc640cdfdc82207ba34a)) - -# [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/authentication-client - -# [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/authentication-client - -# [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)) - -### Features - -- Application service types default to any ([#1566](https://github.com/feathersjs/feathers/issues/1566)) ([d93ba9a](https://github.com/feathersjs/feathers/commit/d93ba9a17edd20d3397bb00f4f6e82e804e42ed6)) -- Feathers v5 core refactoring and features ([#2255](https://github.com/feathersjs/feathers/issues/2255)) ([2dafb7c](https://github.com/feathersjs/feathers/commit/2dafb7ce14ba57406aeec13d10ca45b1e709bee9)) -- **authentication-client:** Throw separate OauthError in authentication client ([#2189](https://github.com/feathersjs/feathers/issues/2189)) ([fa45ec5](https://github.com/feathersjs/feathers/commit/fa45ec520b21834e103e6fe4200b06dced56c0e6)) - -# [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) - -### chore - -- **package:** Remove @feathersjs/primus packages from core ([#1919](https://github.com/feathersjs/feathers/issues/1919)) ([d20b7d5](https://github.com/feathersjs/feathers/commit/d20b7d5a70f4d3306e294696156e8aa0337c35e9)), closes [#1899](https://github.com/feathersjs/feathers/issues/1899) - -### BREAKING CHANGES - -- **package:** Remove primus packages to be moved into the ecosystem. - -# [5.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v4.5.4...v5.0.0-pre.0) (2020-05-19) - -### chore - -- **package:** Remove @feathersjs/primus packages from core ([#1919](https://github.com/feathersjs/feathers/issues/1919)) ([d20b7d5](https://github.com/feathersjs/feathers/commit/d20b7d5a70f4d3306e294696156e8aa0337c35e9)), closes [#1899](https://github.com/feathersjs/feathers/issues/1899) - -### BREAKING CHANGES - -- **package:** Remove primus packages to be moved into the ecosystem. - -## [4.5.11](https://github.com/feathersjs/feathers/compare/v4.5.10...v4.5.11) (2020-12-05) - -### Bug Fixes - -- **authentication-client:** Allow reAuthentication using specific strategy ([#2140](https://github.com/feathersjs/feathers/issues/2140)) ([2a2bbf7](https://github.com/feathersjs/feathers/commit/2a2bbf7f8ee6d32b9fac8afab3421286b06e6443)) -- **socketio-client:** Throw an error and show a warning if someone tries to use socket.io-client v3 ([#2135](https://github.com/feathersjs/feathers/issues/2135)) ([cc3521c](https://github.com/feathersjs/feathers/commit/cc3521c935a1cbd690e29b7057998e3898f282db)) - -## [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/authentication-client - -## [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/authentication-client - -## [4.5.8](https://github.com/feathersjs/feathers/compare/v4.5.7...v4.5.8) (2020-08-12) - -### Bug Fixes - -- **authentication-client:** Fix storage type so it works with all supported interfaces ([#2041](https://github.com/feathersjs/feathers/issues/2041)) ([6ee0e78](https://github.com/feathersjs/feathers/commit/6ee0e78d55cf1214f61458f386b94c350eec32af)) - -## [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/authentication-client - -## [4.5.6](https://github.com/feathersjs/feathers/compare/v4.5.5...v4.5.6) (2020-07-12) - -**Note:** Version bump only for package @feathersjs/authentication-client - -## [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/authentication-client - -## [4.5.4](https://github.com/feathersjs/feathers/compare/v4.5.3...v4.5.4) (2020-04-29) - -**Note:** Version bump only for package @feathersjs/authentication-client - -## [4.5.3](https://github.com/feathersjs/feathers/compare/v4.5.2...v4.5.3) (2020-04-17) - -**Note:** Version bump only for package @feathersjs/authentication-client - -## [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/authentication-client - -## [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/authentication-client - -# [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/authentication-client - -## [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/authentication-client - -## [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/authentication-client - -# [4.4.0](https://github.com/feathersjs/feathers/compare/v4.3.11...v4.4.0) (2019-11-27) - -### Bug Fixes - -- **authentication-client:** Reset authentication promise on socket disconnect ([#1696](https://github.com/feathersjs/feathers/issues/1696)) ([3951626](https://github.com/feathersjs/feathers/commit/395162633ff22e95833a3c2900cb9464bb5b056f)) - -## [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/authentication-client - -## [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/authentication-client - -## [4.3.9](https://github.com/feathersjs/feathers/compare/v4.3.8...v4.3.9) (2019-10-26) - -**Note:** Version bump only for package @feathersjs/authentication-client - -## [4.3.7](https://github.com/feathersjs/feathers/compare/v4.3.6...v4.3.7) (2019-10-14) - -### Bug Fixes - -- Improve authentication client default storage initialization ([#1613](https://github.com/feathersjs/feathers/issues/1613)) ([d7f5107](https://github.com/feathersjs/feathers/commit/d7f5107ef76297b4ca6db580afc5e2b372f5ee4d)) - -## [4.3.5](https://github.com/feathersjs/feathers/compare/v4.3.4...v4.3.5) (2019-10-07) - -### Bug Fixes - -- Authentication type improvements and timeout fix ([#1605](https://github.com/feathersjs/feathers/issues/1605)) ([19854d3](https://github.com/feathersjs/feathers/commit/19854d3)) - -## [4.3.4](https://github.com/feathersjs/feathers/compare/v4.3.3...v4.3.4) (2019-10-03) - -### Bug Fixes - -- Typing improvements ([#1580](https://github.com/feathersjs/feathers/issues/1580)) ([7818aec](https://github.com/feathersjs/feathers/commit/7818aec)) - -## [4.3.3](https://github.com/feathersjs/feathers/compare/v4.3.2...v4.3.3) (2019-09-21) - -### Bug Fixes - -- Small improvements in dependencies and code sturcture ([#1562](https://github.com/feathersjs/feathers/issues/1562)) ([42c13e2](https://github.com/feathersjs/feathers/commit/42c13e2)) - -## [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/authentication-client - -## [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/authentication-client - -# [4.3.0](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.4...v4.3.0) (2019-08-27) - -### Bug Fixes - -- Only remove token on NotAuthenticated error in authentication client and handle error better ([#1525](https://github.com/feathersjs/feathers/issues/1525)) ([13a8758](https://github.com/feathersjs/feathers/commit/13a8758)) - -# [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/authentication-client - -# [4.3.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.2...v4.3.0-pre.3) (2019-08-19) - -### Bug Fixes - -- Update all dependencies ([7d53a00](https://github.com/feathersjs/feathers/commit/7d53a00)) - -### Features - -- Let strategies handle the connection ([#1510](https://github.com/feathersjs/feathers/issues/1510)) ([4329feb](https://github.com/feathersjs/feathers/commit/4329feb)) - -# [4.3.0-pre.2](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.1...v4.3.0-pre.2) (2019-08-02) - -### Bug Fixes - -- Do not error in authentication client on logout ([#1473](https://github.com/feathersjs/feathers/issues/1473)) ([8211b98](https://github.com/feathersjs/feathers/commit/8211b98)) - -# [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/authentication-client - -# [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/authentication-client - -# [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/authentication-client - -# [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 - -- Make oAuth paths more consistent and improve authentication client ([#1377](https://github.com/feathersjs/feathers/issues/1377)) ([adb2543](https://github.com/feathersjs/feathers/commit/adb2543)) -- Typings fix and improvements. ([#1364](https://github.com/feathersjs/feathers/issues/1364)) ([515b916](https://github.com/feathersjs/feathers/commit/515b916)) -- 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) - -**Note:** Version bump only for package @feathersjs/authentication-client - -# [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 - -- Guard against null in client side logout function ([#1319](https://github.com/feathersjs/feathers/issues/1319)) ([fa7f057](https://github.com/feathersjs/feathers/commit/fa7f057)) -- Handle error oAuth redirect in authentication client ([#1307](https://github.com/feathersjs/feathers/issues/1307)) ([12d48ee](https://github.com/feathersjs/feathers/commit/12d48ee)) -- Merge httpStrategies and authStrategies option ([#1308](https://github.com/feathersjs/feathers/issues/1308)) ([afa4d55](https://github.com/feathersjs/feathers/commit/afa4d55)) -- Rename jwtStrategies option to authStrategies ([#1305](https://github.com/feathersjs/feathers/issues/1305)) ([4aee151](https://github.com/feathersjs/feathers/commit/4aee151)) -- Update version number check ([53575c5](https://github.com/feathersjs/feathers/commit/53575c5)) - -# [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 - -- Authentication core improvements ([#1260](https://github.com/feathersjs/feathers/issues/1260)) ([c5dc7a2](https://github.com/feathersjs/feathers/commit/c5dc7a2)) -- 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 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)) -- **package:** update debug to version 3.0.0 ([#61](https://github.com/feathersjs/feathers/issues/61)) ([6f5009c](https://github.com/feathersjs/feathers/commit/6f5009c)) - -### Features - -- @feathersjs/authentication-oauth ([#1299](https://github.com/feathersjs/feathers/issues/1299)) ([656bae7](https://github.com/feathersjs/feathers/commit/656bae7)) -- Add authentication through oAuth redirect to authentication client ([#1301](https://github.com/feathersjs/feathers/issues/1301)) ([35d8043](https://github.com/feathersjs/feathers/commit/35d8043)) -- Add AuthenticationBaseStrategy and make authentication option handling more explicit ([#1284](https://github.com/feathersjs/feathers/issues/1284)) ([2667d92](https://github.com/feathersjs/feathers/commit/2667d92)) -- Add TypeScript definitions ([#1275](https://github.com/feathersjs/feathers/issues/1275)) ([9dd6713](https://github.com/feathersjs/feathers/commit/9dd6713)) -- Authentication v3 client ([#1240](https://github.com/feathersjs/feathers/issues/1240)) ([65b43bd](https://github.com/feathersjs/feathers/commit/65b43bd)) -- Authentication v3 core server implementation ([#1205](https://github.com/feathersjs/feathers/issues/1205)) ([1bd7591](https://github.com/feathersjs/feathers/commit/1bd7591)) - -### BREAKING CHANGES - -- Rewrite for authentication v3 - -## [1.0.11](https://github.com/feathersjs/feathers/compare/@feathersjs/authentication-client@1.0.10...@feathersjs/authentication-client@1.0.11) (2019-01-26) - -**Note:** Version bump only for package @feathersjs/authentication-client - -## [1.0.10](https://github.com/feathersjs/feathers/compare/@feathersjs/authentication-client@1.0.9...@feathersjs/authentication-client@1.0.10) (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)) - - - -## [1.0.9](https://github.com/feathersjs/feathers/compare/@feathersjs/authentication-client@1.0.8...@feathersjs/authentication-client@1.0.9) (2018-12-16) - -**Note:** Version bump only for package @feathersjs/authentication-client - - - -## [1.0.8](https://github.com/feathersjs/feathers/compare/@feathersjs/authentication-client@1.0.7...@feathersjs/authentication-client@1.0.8) (2018-10-26) - -**Note:** Version bump only for package @feathersjs/authentication-client - - - -## [1.0.7](https://github.com/feathersjs/feathers/compare/@feathersjs/authentication-client@1.0.6...@feathersjs/authentication-client@1.0.7) (2018-10-25) - -### 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)) - - - -## [1.0.6](https://github.com/feathersjs/feathers/compare/@feathersjs/authentication-client@1.0.5...@feathersjs/authentication-client@1.0.6) (2018-09-21) - -**Note:** Version bump only for package @feathersjs/authentication-client - - - -## [1.0.5](https://github.com/feathersjs/feathers/compare/@feathersjs/authentication-client@1.0.4...@feathersjs/authentication-client@1.0.5) (2018-09-17) - -**Note:** Version bump only for package @feathersjs/authentication-client - - - -## [1.0.4](https://github.com/feathersjs/feathers/compare/@feathersjs/authentication-client@1.0.3...@feathersjs/authentication-client@1.0.4) (2018-09-02) - -**Note:** Version bump only for package @feathersjs/authentication-client - - - -## 1.0.3 - -- Migrate to Monorepo ([feathers#462](https://github.com/feathersjs/feathers/issues/462)) - -## [v1.0.2](https://github.com/feathersjs/authentication-client/tree/v1.0.2) (2018-01-03) - -[Full Changelog](https://github.com/feathersjs/authentication-client/compare/v1.0.1...v1.0.2) - -**Closed issues:** - -- No Auth header added when sending 1st request [\#80](https://github.com/feathersjs/authentication-client/issues/80) - -**Merged pull requests:** - -- Update to correspond with latest release [\#84](https://github.com/feathersjs/authentication-client/pull/84) ([daffl](https://github.com/daffl)) -- Update semistandard to the latest version 🚀 [\#83](https://github.com/feathersjs/authentication-client/pull/83) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update feathers-memory to the latest version 🚀 [\#82](https://github.com/feathersjs/authentication-client/pull/82) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v1.0.1](https://github.com/feathersjs/authentication-client/tree/v1.0.1) (2017-11-16) - -[Full Changelog](https://github.com/feathersjs/authentication-client/compare/v1.0.0...v1.0.1) - -**Merged pull requests:** - -- Add default export for better ES module \(TypeScript\) compatibility [\#81](https://github.com/feathersjs/authentication-client/pull/81) ([daffl](https://github.com/daffl)) -- Update @feathersjs/authentication to the latest version 🚀 [\#79](https://github.com/feathersjs/authentication-client/pull/79) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v1.0.0](https://github.com/feathersjs/authentication-client/tree/v1.0.0) (2017-11-01) - -[Full Changelog](https://github.com/feathersjs/authentication-client/compare/v1.0.0-pre.1...v1.0.0) - -**Merged pull requests:** - -- Update dependencies for release [\#78](https://github.com/feathersjs/authentication-client/pull/78) ([daffl](https://github.com/daffl)) - -## [v1.0.0-pre.1](https://github.com/feathersjs/authentication-client/tree/v1.0.0-pre.1) (2017-10-25) - -[Full Changelog](https://github.com/feathersjs/authentication-client/compare/v0.3.3...v1.0.0-pre.1) - -**Closed issues:** - -- Error authenticating! Error: Token provided to verifyJWT is missing or not a string ? [\#73](https://github.com/feathersjs/authentication-client/issues/73) -- Authorization Header not sent!! [\#69](https://github.com/feathersjs/authentication-client/issues/69) -- users.get\(id\) failed \(Not authenticated\) after successful login. [\#66](https://github.com/feathersjs/authentication-client/issues/66) - -**Merged pull requests:** - -- Updates for Feathers v3 [\#77](https://github.com/feathersjs/authentication-client/pull/77) ([daffl](https://github.com/daffl)) -- Update Codeclimate token and badges [\#76](https://github.com/feathersjs/authentication-client/pull/76) ([daffl](https://github.com/daffl)) -- Rename repository and use npm scope [\#75](https://github.com/feathersjs/authentication-client/pull/75) ([daffl](https://github.com/daffl)) -- Update to new plugin infrastructure [\#74](https://github.com/feathersjs/authentication-client/pull/74) ([daffl](https://github.com/daffl)) -- Update mocha to the latest version 🚀 [\#72](https://github.com/feathersjs/authentication-client/pull/72) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Add babel-polyfill and package-lock.json [\#68](https://github.com/feathersjs/authentication-client/pull/68) ([daffl](https://github.com/daffl)) -- Passport.verifyJWT should return Promise\, not Promise\ [\#65](https://github.com/feathersjs/authentication-client/pull/65) ([zxh19890103](https://github.com/zxh19890103)) -- Update debug to the latest version 🚀 [\#61](https://github.com/feathersjs/authentication-client/pull/61) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update ws to the latest version 🚀 [\#60](https://github.com/feathersjs/authentication-client/pull/60) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v0.3.3](https://github.com/feathersjs/authentication-client/tree/v0.3.3) (2017-07-18) - -[Full Changelog](https://github.com/feathersjs/authentication-client/compare/v0.3.2...v0.3.3) - -**Closed issues:** - -- An in-range update of feathers is breaking the build 🚨 [\#59](https://github.com/feathersjs/authentication-client/issues/59) -- An in-range update of feathers is breaking the build 🚨 [\#58](https://github.com/feathersjs/authentication-client/issues/58) - -**Merged pull requests:** - -- typings: add auth methods to feathers.Application interface [\#57](https://github.com/feathersjs/authentication-client/pull/57) ([j2L4e](https://github.com/j2L4e)) -- Update feathers-authentication-local to the latest version 🚀 [\#55](https://github.com/feathersjs/authentication-client/pull/55) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update chai to the latest version 🚀 [\#54](https://github.com/feathersjs/authentication-client/pull/54) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update feathers-socketio to the latest version 🚀 [\#50](https://github.com/feathersjs/authentication-client/pull/50) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update socket.io-client to the latest version 🚀 [\#49](https://github.com/feathersjs/authentication-client/pull/49) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update README.md [\#47](https://github.com/feathersjs/authentication-client/pull/47) ([bertho-zero](https://github.com/bertho-zero)) - -## [v0.3.2](https://github.com/feathersjs/authentication-client/tree/v0.3.2) (2017-04-30) - -[Full Changelog](https://github.com/feathersjs/authentication-client/compare/v0.3.1...v0.3.2) - -**Closed issues:** - -- An in-range update of feathers-errors is breaking the build 🚨 [\#45](https://github.com/feathersjs/authentication-client/issues/45) -- Proper way to save jwt in cookies [\#41](https://github.com/feathersjs/authentication-client/issues/41) -- Allow customizing the `tokenField` [\#38](https://github.com/feathersjs/authentication-client/issues/38) -- Show blank page in safari@iOS 8.3 [\#37](https://github.com/feathersjs/authentication-client/issues/37) - -**Merged pull requests:** - -- Catch getJWT promise errors [\#46](https://github.com/feathersjs/authentication-client/pull/46) ([NikitaVlaznev](https://github.com/NikitaVlaznev)) -- Update semistandard to the latest version 🚀 [\#43](https://github.com/feathersjs/authentication-client/pull/43) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update feathers-hooks to the latest version 🚀 [\#42](https://github.com/feathersjs/authentication-client/pull/42) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update dependencies to enable Greenkeeper 🌴 [\#40](https://github.com/feathersjs/authentication-client/pull/40) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Note that auth must be configured after rest/socket clients [\#36](https://github.com/feathersjs/authentication-client/pull/36) ([hubgit](https://github.com/hubgit)) - -## [v0.3.1](https://github.com/feathersjs/authentication-client/tree/v0.3.1) (2017-03-10) - -[Full Changelog](https://github.com/feathersjs/authentication-client/compare/v0.3.0...v0.3.1) - -**Closed issues:** - -- The latest tag on NPM is wrong [\#35](https://github.com/feathersjs/authentication-client/issues/35) -- exp claim should be optional [\#33](https://github.com/feathersjs/authentication-client/issues/33) - -**Merged pull requests:** - -- Fix \#33 exp claim should be optional [\#34](https://github.com/feathersjs/authentication-client/pull/34) ([whollacsek](https://github.com/whollacsek)) - -## [v0.3.0](https://github.com/feathersjs/authentication-client/tree/v0.3.0) (2017-03-08) - -[Full Changelog](https://github.com/feathersjs/authentication-client/compare/v0.2.0...v0.3.0) - -## [v0.2.0](https://github.com/feathersjs/authentication-client/tree/v0.2.0) (2017-03-07) - -[Full Changelog](https://github.com/feathersjs/authentication-client/compare/v0.1.10...v0.2.0) - -**Closed issues:** - -- Support `authenticated` and `logout` client side events [\#29](https://github.com/feathersjs/authentication-client/issues/29) -- The default header mismatches the default feathers-authentication header [\#23](https://github.com/feathersjs/authentication-client/issues/23) -- Re-authenticating fails when passing options [\#22](https://github.com/feathersjs/authentication-client/issues/22) -- Socket.io timeout does nothing when there is JWT token available [\#19](https://github.com/feathersjs/authentication-client/issues/19) - -**Merged pull requests:** - -- Fix header casing [\#32](https://github.com/feathersjs/authentication-client/pull/32) ([daffl](https://github.com/daffl)) -- Add client side `authenticated` and `logout` events [\#31](https://github.com/feathersjs/authentication-client/pull/31) ([daffl](https://github.com/daffl)) -- Add support for socket timeouts and some refactoring [\#30](https://github.com/feathersjs/authentication-client/pull/30) ([daffl](https://github.com/daffl)) - -## [v0.1.10](https://github.com/feathersjs/authentication-client/tree/v0.1.10) (2017-03-03) - -[Full Changelog](https://github.com/feathersjs/authentication-client/compare/v0.1.9...v0.1.10) - -**Merged pull requests:** - -- Remove hardcoded values for Config and Credentials typings [\#28](https://github.com/feathersjs/authentication-client/pull/28) ([myknbani](https://github.com/myknbani)) - -## [v0.1.9](https://github.com/feathersjs/authentication-client/tree/v0.1.9) (2017-03-01) - -[Full Changelog](https://github.com/feathersjs/authentication-client/compare/v0.1.8...v0.1.9) - -**Merged pull requests:** - -- Typescript Definitions [\#25](https://github.com/feathersjs/authentication-client/pull/25) ([AbraaoAlves](https://github.com/AbraaoAlves)) - -## [v0.1.8](https://github.com/feathersjs/authentication-client/tree/v0.1.8) (2017-02-05) - -[Full Changelog](https://github.com/feathersjs/authentication-client/compare/v0.1.7...v0.1.8) - -**Closed issues:** - -- Uncaught TypeError: Cannot read property 'options' of undefined [\#26](https://github.com/feathersjs/authentication-client/issues/26) -- Browser Version [\#24](https://github.com/feathersjs/authentication-client/issues/24) - -**Merged pull requests:** - -- Hoist upgrade handler into current scope by using an arrow function [\#27](https://github.com/feathersjs/authentication-client/pull/27) ([daffl](https://github.com/daffl)) - -## [v0.1.7](https://github.com/feathersjs/authentication-client/tree/v0.1.7) (2017-01-29) - -[Full Changelog](https://github.com/feathersjs/authentication-client/compare/v0.1.6...v0.1.7) - -**Closed issues:** - -- \[Webpack\] TypeError: \_this4.storage.getItem is not a function [\#18](https://github.com/feathersjs/authentication-client/issues/18) -- \[Feature request\] Signup via socket [\#17](https://github.com/feathersjs/authentication-client/issues/17) -- Missing auth token when used with feathers-rest in comparison to feathers-socketio [\#16](https://github.com/feathersjs/authentication-client/issues/16) -- Cannot read property 'on' of undefined - feathers-authentication-client [\#12](https://github.com/feathersjs/authentication-client/issues/12) - -**Merged pull requests:** - -- Update passport.js [\#20](https://github.com/feathersjs/authentication-client/pull/20) ([bertho-zero](https://github.com/bertho-zero)) - -## [v0.1.6](https://github.com/feathersjs/authentication-client/tree/v0.1.6) (2016-12-14) - -[Full Changelog](https://github.com/feathersjs/authentication-client/compare/v0.1.5...v0.1.6) - -**Closed issues:** - -- `logout\(\)` doesn't resolve [\#10](https://github.com/feathersjs/authentication-client/issues/10) - -**Merged pull requests:** - -- Fix linting [\#13](https://github.com/feathersjs/authentication-client/pull/13) ([marshallswain](https://github.com/marshallswain)) - -## [v0.1.5](https://github.com/feathersjs/authentication-client/tree/v0.1.5) (2016-12-13) - -[Full Changelog](https://github.com/feathersjs/authentication-client/compare/v0.1.4...v0.1.5) - -## [v0.1.4](https://github.com/feathersjs/authentication-client/tree/v0.1.4) (2016-12-13) - -[Full Changelog](https://github.com/feathersjs/authentication-client/compare/v0.1.3...v0.1.4) - -**Closed issues:** - -- populateAccessToken tries to access non-existent property [\#11](https://github.com/feathersjs/authentication-client/issues/11) -- Socket client should automatically auth on reconnect [\#2](https://github.com/feathersjs/authentication-client/issues/2) - -**Merged pull requests:** - -- More specific imports for StealJS [\#14](https://github.com/feathersjs/authentication-client/pull/14) ([marshallswain](https://github.com/marshallswain)) - -## [v0.1.3](https://github.com/feathersjs/authentication-client/tree/v0.1.3) (2016-11-23) - -[Full Changelog](https://github.com/feathersjs/authentication-client/compare/v0.1.2...v0.1.3) - -**Closed issues:** - -- Client should ensure socket.io upgrade is complete before authenticating [\#4](https://github.com/feathersjs/authentication-client/issues/4) - -**Merged pull requests:** - -- Socket reconnect [\#9](https://github.com/feathersjs/authentication-client/pull/9) ([ekryski](https://github.com/ekryski)) - -## [v0.1.2](https://github.com/feathersjs/authentication-client/tree/v0.1.2) (2016-11-22) - -[Full Changelog](https://github.com/feathersjs/authentication-client/compare/v0.1.1...v0.1.2) - -**Merged pull requests:** - -- Custom jwt strategy names [\#8](https://github.com/feathersjs/authentication-client/pull/8) ([ekryski](https://github.com/ekryski)) - -## [v0.1.1](https://github.com/feathersjs/authentication-client/tree/v0.1.1) (2016-11-21) - -[Full Changelog](https://github.com/feathersjs/authentication-client/compare/v0.1.0...v0.1.1) - -**Merged pull requests:** - -- Socket reconnect upgrade auth [\#3](https://github.com/feathersjs/authentication-client/pull/3) ([marshallswain](https://github.com/marshallswain)) - -## [v0.1.0](https://github.com/feathersjs/authentication-client/tree/v0.1.0) (2016-11-18) - -**Closed issues:** - -- Relation with feathers-authentication [\#6](https://github.com/feathersjs/authentication-client/issues/6) -- Client: Docs for getJWT & verifyJWT [\#1](https://github.com/feathersjs/authentication-client/issues/1) - -**Merged pull requests:** - -- Feathers authentication 1.0 compatible client [\#7](https://github.com/feathersjs/authentication-client/pull/7) ([ekryski](https://github.com/ekryski)) - -\* _This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)_ diff --git a/packages/authentication-client/LICENSE b/packages/authentication-client/LICENSE deleted file mode 100644 index 7712f870f3..0000000000 --- a/packages/authentication-client/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2024 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 -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -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 deleted file mode 100644 index aa47ecfb25..0000000000 --- a/packages/authentication-client/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# @feathersjs/authentication-client - -[![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/authentication-client.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/authentication-client) -[![Discord](https://badgen.net/badge/icon/discord?icon=discord&label)](https://discord.gg/qa8kez8QBx) - -> Feathers authentication client - -## Installation - -``` -npm install @feathersjs/authentication-client --save -``` - -## Documentation - -Refer to the [Feathers authentication client API documentation](https://feathersjs.com/api/authentication/client.html) 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/authentication-client/package.json b/packages/authentication-client/package.json deleted file mode 100644 index 7457b4645b..0000000000 --- a/packages/authentication-client/package.json +++ /dev/null @@ -1,77 +0,0 @@ -{ - "name": "@feathersjs/authentication-client", - "description": "The authentication plugin for feathers-client", - "version": "5.0.34", - "homepage": "https://feathersjs.com", - "main": "lib/", - "types": "lib/", - "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", - "directory": "packages/authentication-client" - }, - "author": { - "name": "Feathers contributors", - "email": "hello@feathersjs.com", - "url": "https://feathersjs.com" - }, - "contributors": [], - "bugs": { - "url": "https://github.com/feathersjs/feathers/issues" - }, - "engines": { - "node": ">= 12" - }, - "files": [ - "CHANGELOG.md", - "LICENSE", - "README.md", - "src/**", - "lib/**", - "*.d.ts", - "*.js" - ], - "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" - }, - "directories": { - "lib": "lib" - }, - "publishConfig": { - "access": "public" - }, - "dependencies": { - "@feathersjs/authentication": "^5.0.34", - "@feathersjs/commons": "^5.0.34", - "@feathersjs/errors": "^5.0.34", - "@feathersjs/feathers": "^5.0.34" - }, - "devDependencies": { - "@feathersjs/authentication-local": "^5.0.34", - "@feathersjs/express": "^5.0.34", - "@feathersjs/memory": "^5.0.34", - "@feathersjs/rest-client": "^5.0.34", - "@feathersjs/socketio": "^5.0.34", - "@feathersjs/socketio-client": "^5.0.34", - "@types/mocha": "^10.0.10", - "@types/node": "^24.1.0", - "axios": "^1.11.0", - "mocha": "^11.7.1", - "shx": "^0.4.0", - "ts-node": "^10.9.2", - "typescript": "^5.9.2" - }, - "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" -} diff --git a/packages/authentication-client/src/core.ts b/packages/authentication-client/src/core.ts deleted file mode 100644 index cad7754e67..0000000000 --- a/packages/authentication-client/src/core.ts +++ /dev/null @@ -1,248 +0,0 @@ -import { NotAuthenticated, FeathersError } from '@feathersjs/errors' -import { Application, Params } from '@feathersjs/feathers' -import { AuthenticationRequest, AuthenticationResult } from '@feathersjs/authentication' -import { Storage, StorageWrapper } from './storage' - -class OauthError extends FeathersError { - constructor(message: string, data?: any) { - super(message, 'OauthError', 401, 'oauth-error', data) - } -} - -const getMatch = (location: Location, key: string): [string, RegExp] => { - const regex = new RegExp(`(?:\&?)${key}=([^&]*)`) - const match = location.hash ? location.hash.match(regex) : null - - if (match !== null) { - const [, value] = match - - return [value, regex] - } - - return [null, regex] -} - -export type ClientConstructor = new ( - app: Application, - options: AuthenticationClientOptions -) => AuthenticationClient - -export interface AuthenticationClientOptions { - storage: Storage - header: string - scheme: string - storageKey: string - locationKey: string - locationErrorKey: string - jwtStrategy: string - path: string - Authentication: ClientConstructor -} - -export class AuthenticationClient { - app: Application - authenticated: boolean - options: AuthenticationClientOptions - - constructor(app: Application, options: AuthenticationClientOptions) { - const socket = app.io - const storage = new StorageWrapper(app.get('storage') || options.storage) - - this.app = app - this.options = options - this.authenticated = false - this.app.set('storage', storage) - - if (socket) { - this.handleSocket(socket) - } - } - - get service() { - return this.app.service(this.options.path) - } - - get storage() { - return this.app.get('storage') as Storage - } - - handleSocket(socket: any) { - // When the socket disconnects and we are still authenticated, try to reauthenticate right away - // the websocket connection will handle timeouts and retries - socket.on('disconnect', () => { - if (this.authenticated) { - this.reAuthenticate(true) - } - }) - } - - /** - * Parse the access token or authentication error from the window location hash. Will remove it from the hash - * if found. - * - * @param location The window location - * @returns The access token if available, will throw an error if found, otherwise null - */ - getFromLocation(location: Location) { - const [accessToken, tokenRegex] = getMatch(location, this.options.locationKey) - - if (accessToken !== null) { - location.hash = location.hash.replace(tokenRegex, '') - - return Promise.resolve(accessToken) - } - - const [message, errorRegex] = getMatch(location, this.options.locationErrorKey) - - if (message !== null) { - location.hash = location.hash.replace(errorRegex, '') - - return Promise.reject(new OauthError(decodeURIComponent(message))) - } - - return Promise.resolve(null) - } - - /** - * Set the access token in storage. - * - * @param accessToken The access token to set - * @returns - */ - setAccessToken(accessToken: string) { - return this.storage.setItem(this.options.storageKey, accessToken) - } - - /** - * Returns the access token from storage or the window location hash. - * - * @returns The access token from storage or location hash - */ - getAccessToken(): Promise { - return this.storage.getItem(this.options.storageKey).then((accessToken: string) => { - if (!accessToken && typeof window !== 'undefined' && window.location) { - return this.getFromLocation(window.location) - } - - return accessToken || null - }) - } - - /** - * Remove the access token from storage - * @returns The removed access token - */ - removeAccessToken() { - return this.storage.removeItem(this.options.storageKey) - } - - /** - * Reset the internal authentication state. Usually not necessary to call directly. - * - * @returns null - */ - reset() { - this.app.set('authentication', null) - this.authenticated = false - - return Promise.resolve(null) - } - - handleError(error: FeathersError, type: 'authenticate' | 'logout') { - // For NotAuthenticated, PaymentError, Forbidden, NotFound, MethodNotAllowed, NotAcceptable - // errors, remove the access token - if (error.code > 400 && error.code < 408) { - const promise = this.removeAccessToken().then(() => this.reset()) - - return type === 'logout' ? promise : promise.then(() => Promise.reject(error)) - } - - return this.reset().then(() => Promise.reject(error)) - } - - /** - * Try to reauthenticate using the token from storage. Will do nothing if already authenticated unless - * `force` is true. - * - * @param force force reauthentication with the server - * @param strategy The name of the strategy to use. Defaults to `options.jwtStrategy` - * @param authParams Additional authentication parameters - * @returns The reauthentication result - */ - reAuthenticate(force = false, strategy?: string, authParams?: Params): Promise { - // Either returns the authentication state or - // tries to re-authenticate with the stored JWT and strategy - let authPromise = this.app.get('authentication') - - if (!authPromise || force === true) { - authPromise = this.getAccessToken().then((accessToken) => { - if (!accessToken) { - return this.handleError(new NotAuthenticated('No accessToken found in storage'), 'authenticate') - } - - return this.authenticate( - { - strategy: strategy || this.options.jwtStrategy, - accessToken - }, - authParams - ) - }) - this.app.set('authentication', authPromise) - } - - return authPromise - } - - /** - * Authenticate using a specific strategy and data. - * - * @param authentication The authentication data - * @param params Additional parameters - * @returns The authentication result - */ - authenticate(authentication?: AuthenticationRequest, params?: Params): Promise { - if (!authentication) { - return this.reAuthenticate() - } - - const promise = this.service - .create(authentication, params) - .then((authResult: AuthenticationResult) => { - const { accessToken } = authResult - - this.authenticated = true - this.app.emit('login', authResult) - this.app.emit('authenticated', authResult) - - return this.setAccessToken(accessToken).then(() => authResult) - }) - .catch((error: FeathersError) => this.handleError(error, 'authenticate')) - - this.app.set('authentication', promise) - - return promise - } - - /** - * Log out the current user and remove their token. Will do nothing - * if not authenticated. - * - * @returns The log out result. - */ - logout(): Promise { - return Promise.resolve(this.app.get('authentication')) - .then(() => - this.service.remove(null).then((authResult: AuthenticationResult) => - this.removeAccessToken() - .then(() => this.reset()) - .then(() => { - this.app.emit('logout', authResult) - - return authResult - }) - ) - ) - .catch((error: FeathersError) => this.handleError(error, 'logout')) - } -} diff --git a/packages/authentication-client/src/hooks/authentication.ts b/packages/authentication-client/src/hooks/authentication.ts deleted file mode 100644 index bba7b2dc2d..0000000000 --- a/packages/authentication-client/src/hooks/authentication.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { HookContext, NextFunction } from '@feathersjs/feathers' -import { stripSlashes } from '@feathersjs/commons' - -export const authentication = () => { - return (context: HookContext, next: NextFunction) => { - const { - app, - params, - path, - method, - app: { authentication: service } - } = context - - if (stripSlashes(service.options.path) === path && method === 'create') { - return next() - } - - return Promise.resolve(app.get('authentication')) - .then((authResult) => { - if (authResult) { - context.params = Object.assign({}, authResult, params) - } - }) - .then(next) - } -} diff --git a/packages/authentication-client/src/hooks/index.ts b/packages/authentication-client/src/hooks/index.ts deleted file mode 100644 index ef7cf4ea53..0000000000 --- a/packages/authentication-client/src/hooks/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { authentication } from './authentication' -export { populateHeader } from './populate-header' diff --git a/packages/authentication-client/src/hooks/populate-header.ts b/packages/authentication-client/src/hooks/populate-header.ts deleted file mode 100644 index 1b4776187a..0000000000 --- a/packages/authentication-client/src/hooks/populate-header.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { HookContext, NextFunction } from '@feathersjs/feathers' - -export const populateHeader = () => { - return (context: HookContext, next: NextFunction) => { - const { - app, - params: { accessToken } - } = context - const authentication = app.authentication - - // Set REST header if necessary - if (app.rest && accessToken) { - const { scheme, header } = authentication.options - const authHeader = `${scheme} ${accessToken}` - - context.params.headers = Object.assign( - {}, - { - [header]: authHeader - }, - context.params.headers - ) - } - - return next() - } -} diff --git a/packages/authentication-client/src/index.ts b/packages/authentication-client/src/index.ts deleted file mode 100644 index 5ab704a8d7..0000000000 --- a/packages/authentication-client/src/index.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { AuthenticationClient, AuthenticationClientOptions } from './core' -import * as hooks from './hooks' -import { Application } from '@feathersjs/feathers' -import { Storage, MemoryStorage, StorageWrapper } from './storage' - -declare module '@feathersjs/feathers/lib/declarations' { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - interface Application { - // eslint-disable-line - io: any - rest?: any - authentication: AuthenticationClient - authenticate: AuthenticationClient['authenticate'] - reAuthenticate: AuthenticationClient['reAuthenticate'] - logout: AuthenticationClient['logout'] - } -} - -export const getDefaultStorage = () => { - try { - return new StorageWrapper(window.localStorage) - } catch (error: any) {} - - return new MemoryStorage() -} - -export { AuthenticationClient, AuthenticationClientOptions, Storage, MemoryStorage, hooks } - -export type ClientConstructor = new ( - app: Application, - options: AuthenticationClientOptions -) => AuthenticationClient - -export const defaultStorage: Storage = getDefaultStorage() - -export const defaults: AuthenticationClientOptions = { - header: 'Authorization', - scheme: 'Bearer', - storageKey: 'feathers-jwt', - locationKey: 'access_token', - locationErrorKey: 'error', - jwtStrategy: 'jwt', - path: '/authentication', - Authentication: AuthenticationClient, - storage: defaultStorage -} - -const init = (_options: Partial = {}) => { - const options: AuthenticationClientOptions = Object.assign({}, defaults, _options) - const { Authentication } = options - - return (app: Application) => { - const authentication = new Authentication(app, options) - - app.authentication = authentication - app.authenticate = authentication.authenticate.bind(authentication) - app.reAuthenticate = authentication.reAuthenticate.bind(authentication) - app.logout = authentication.logout.bind(authentication) - - app.hooks([hooks.authentication(), hooks.populateHeader()]) - } -} - -export default init - -if (typeof module !== 'undefined') { - module.exports = Object.assign(init, module.exports) -} diff --git a/packages/authentication-client/src/storage.ts b/packages/authentication-client/src/storage.ts deleted file mode 100644 index f344eabee6..0000000000 --- a/packages/authentication-client/src/storage.ts +++ /dev/null @@ -1,49 +0,0 @@ -export interface Storage { - getItem(key: string): any - setItem?(key: string, value: any): any - removeItem?(key: string): any -} - -export class MemoryStorage implements Storage { - store: { [key: string]: any } - - constructor() { - this.store = {} - } - - getItem(key: string) { - return Promise.resolve(this.store[key]) - } - - setItem(key: string, value: any) { - return Promise.resolve((this.store[key] = value)) - } - - removeItem(key: string) { - const value = this.store[key] - - delete this.store[key] - - return Promise.resolve(value) - } -} - -export class StorageWrapper implements Storage { - storage: any - - constructor(storage: any) { - this.storage = storage - } - - getItem(key: string) { - return Promise.resolve(this.storage?.getItem(key)) - } - - setItem(key: string, value: any) { - return Promise.resolve(this.storage?.setItem(key, value)) - } - - removeItem(key: string) { - return Promise.resolve(this.storage?.removeItem(key)) - } -} diff --git a/packages/authentication-client/test/index.test.ts b/packages/authentication-client/test/index.test.ts deleted file mode 100644 index 1720b45a4e..0000000000 --- a/packages/authentication-client/test/index.test.ts +++ /dev/null @@ -1,247 +0,0 @@ -import assert from 'assert' -import { feathers, Application } from '@feathersjs/feathers' - -import client from '../src' -import { AuthenticationClient } from '../src' -import { NotAuthenticated } from '@feathersjs/errors' - -describe('@feathersjs/authentication-client', () => { - const accessToken = 'testing' - const user = { - name: 'Test User' - } - let app: Application - - beforeEach(() => { - app = feathers() - - app.configure(client()) - app.use('/authentication', { - async create(data: any) { - if (data.error) { - throw new Error('Did not work') - } - - return { - accessToken, - data, - user - } - }, - - async remove(id) { - if (!app.get('authentication')) { - throw new NotAuthenticated('Not logged in') - } - - return { id } - } - }) - app.use('dummy', { - async find(params) { - return params - } - }) - }) - - it('initializes', () => { - assert.ok(app.authentication instanceof AuthenticationClient) - assert.strictEqual(app.get('storage'), app.authentication.storage) - assert.strictEqual(typeof app.authenticate, 'function') - assert.strictEqual(typeof app.logout, 'function') - }) - - it('setAccessToken, getAccessToken, removeAccessToken', async () => { - const auth = app.authentication - const token = 'hi' - - await auth.setAccessToken(token) - - const res = await auth.getAccessToken() - - assert.strictEqual(res, token) - - await auth.removeAccessToken() - assert.strictEqual(await auth.getAccessToken(), null) - }) - - it('getFromLocation', async () => { - const auth = app.authentication - let dummyLocation = { hash: 'access_token=testing' } as Location - - let token = await auth.getFromLocation(dummyLocation) - - assert.strictEqual(token, 'testing') - assert.strictEqual(dummyLocation.hash, '') - - dummyLocation.hash = 'a=b&access_token=otherTest&c=d' - token = await auth.getFromLocation(dummyLocation) - - assert.strictEqual(token, 'otherTest') - assert.strictEqual(dummyLocation.hash, 'a=b&c=d') - - dummyLocation = { search: 'access_token=testing' } as Location - token = await auth.getFromLocation(dummyLocation) - - assert.strictEqual(await auth.getFromLocation({} as Location), null) - - try { - await auth.getFromLocation({ - hash: 'error=Error Happened&x=y' - } as Location) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'OauthError') - assert.strictEqual(error.message, 'Error Happened') - } - }) - - it('authenticate, authentication hook, login event', async () => { - const data = { - strategy: 'testing' - } - - const promise = new Promise((resolve) => { - app.once('login', resolve) - }) - - app.authenticate(data) - - const result = await promise - - assert.deepStrictEqual(result, { - accessToken, - data, - user - }) - - let at = await app.authentication.getAccessToken() - - assert.strictEqual(at, accessToken, 'Set accessToken in storage') - - at = await Promise.resolve(app.get('storage').getItem('feathers-jwt')) - - assert.strictEqual(at, accessToken, 'Set accessToken in storage') - - const found = await app.service('dummy').find() - assert.deepStrictEqual(found.accessToken, accessToken) - assert.deepStrictEqual(found.user, user) - }) - - it('logout event', async () => { - const promise = new Promise((resolve) => app.once('logout', resolve)) - - app.authenticate({ strategy: 'testing' }).then(() => app.logout()) - - const result = await promise - - assert.deepStrictEqual(result, { id: null }) - }) - - it('does not remove AccessToken on other errors', async () => { - await app.authenticate({ strategy: 'testing' }) - await app.authenticate({ strategy: 'testing' }) - - const at = await app.authentication.getAccessToken() - - assert.strictEqual(at, accessToken) - }) - - it('resets after any error (#1947)', async () => { - await assert.rejects(() => app.authenticate({ strategy: 'testing', error: true }), { - message: 'Did not work' - }) - - const found = await app.service('dummy').find() - - assert.deepStrictEqual(found, {}) - }) - - it('logout when not logged in without error', async () => { - const result = await app.logout() - - assert.strictEqual(result, null) - }) - - describe('reauthenticate', () => { - it('fails when no token in storage and resets authentication state', async () => { - await assert.rejects(() => app.authentication.reAuthenticate(), { - message: 'No accessToken found in storage' - }) - assert.ok(!app.get('authentication'), 'Reset authentication') - }) - - it('reauthenticates when token is in storage', async () => { - const data = { - strategy: 'testing' - } - - const result = await app.authenticate(data) - - assert.deepStrictEqual(result, { - accessToken, - data, - user - }) - await app.authentication.reAuthenticate() - await app.authentication.reset() - - let at = await Promise.resolve(app.get('storage').getItem('feathers-jwt')) - - assert.strictEqual(at, accessToken, 'Set accessToken in storage') - - at = await app.authentication.reAuthenticate() - - assert.deepStrictEqual(at, { - accessToken, - data: { strategy: 'jwt', accessToken: 'testing' }, - user - }) - - await app.logout() - - at = await Promise.resolve(app.get('storage').getItem('feathers-jwt')) - assert.ok(!at) - assert.ok(!app.get('authentication')) - }) - - it('reAuthenticate works with parallel requests', async () => { - const data = { - strategy: 'testing' - } - - await app.authenticate(data) - await app.reAuthenticate() - await app.authentication.reset() - - app.reAuthenticate() - - const found = await app.service('dummy').find() - - assert.deepStrictEqual(found.accessToken, accessToken) - assert.deepStrictEqual(found.user, user) - }) - - it('reauthenticates using different strategy', async () => { - app.configure(client({ jwtStrategy: 'any' })) - - const data = { - strategy: 'testing' - } - - let result = await app.authenticate(data) - assert.deepStrictEqual(result, { - accessToken, - data, - user - }) - - result = await app.authentication.reAuthenticate(false, 'jwt') - assert.deepStrictEqual(result, { - accessToken, - data, - user - }) - }) - }) -}) diff --git a/packages/authentication-client/test/integration/commons.ts b/packages/authentication-client/test/integration/commons.ts deleted file mode 100644 index 4973530792..0000000000 --- a/packages/authentication-client/test/integration/commons.ts +++ /dev/null @@ -1,118 +0,0 @@ -import assert from 'assert' -import { Application } from '@feathersjs/feathers' -import '../../src' - -export default ( - getApp: () => Application, - getClient: () => Application, - { provider, email, password }: { provider: string; email: string; password: string } -) => { - describe('common tests', () => { - let client: Application - let user: any - - before( - async () => - (user = await getApp().service('users').create({ - email, - password - })) - ) - - beforeEach(() => { - client = getClient() - }) - - after(async () => { - await getApp().service('users').remove(user.id) - }) - - it('authenticates with local strategy', async () => { - const result = await client.authenticate({ - strategy: 'local', - email, - password - }) - - assert.ok(result.accessToken) - assert.strictEqual(result.authentication.strategy, 'local') - assert.strictEqual(result.user.email, email) - }) - - it('authentication with wrong credentials fails, does not maintain state', async () => { - await assert.rejects( - () => - client.authenticate({ - strategy: 'local', - email, - password: 'blabla' - }), - { - name: 'NotAuthenticated', - message: 'Invalid login' - } - ) - assert.ok(!client.get('authentication'), 'Reset client state') - }) - - it('errors when not authenticated', async () => { - await assert.rejects(() => client.service('dummy').find(), { - name: 'NotAuthenticated', - code: 401, - message: 'Not authenticated' - }) - }) - - it('authenticates and allows access', async () => { - await client.authenticate({ - strategy: 'local', - email, - password - }) - const result = await client.service('dummy').find() - - assert.strictEqual(result.provider, provider) - assert.ok(result.authentication) - assert.ok(result.authentication.payload) - assert.strictEqual(result.user.email, user.email) - assert.strictEqual(result.user.id, user.id) - }) - - it('re-authenticates', async () => { - await client.authenticate({ - strategy: 'local', - email, - password - }) - - client.authentication.reset() - client.authenticate() - const result = await client.service('dummy').find() - - assert.strictEqual(result.provider, provider) - assert.ok(result.authentication) - assert.ok(result.authentication.payload) - assert.strictEqual(result.user.email, user.email) - assert.strictEqual(result.user.id, user.id) - }) - - it('after logout does not allow subsequent access', async () => { - await client.authenticate({ - strategy: 'local', - email, - password - }) - - const result = await client.logout() - - assert.ok(result!.accessToken) - assert.ok(result!.user) - - assert.rejects(() => client.service('dummy').find(), { - name: 'NotAuthenticated', - code: 401, - message: 'Not authenticated' - }) - }) - }) -} diff --git a/packages/authentication-client/test/integration/express.test.ts b/packages/authentication-client/test/integration/express.test.ts deleted file mode 100644 index e5f7709c6b..0000000000 --- a/packages/authentication-client/test/integration/express.test.ts +++ /dev/null @@ -1,40 +0,0 @@ -import axios from 'axios' -import { Server } from 'http' -import { feathers, Application as FeathersApplication } 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' - -describe('@feathersjs/authentication-client Express integration', () => { - let app: express.Application - let server: Server - - before(async () => { - const restApp = express - .default(feathers()) - .use(express.json()) - .configure(express.rest()) - .use(express.parseAuthentication()) - app = getApp(restApp as unknown as FeathersApplication) as express.Application - app.use(express.errorHandler()) - - server = await app.listen(9776) - }) - - after((done) => server.close(() => done())) - - commonTests( - () => app, - () => { - return feathers().configure(rest('http://localhost:9776').axios(axios)).configure(authClient()) - }, - { - email: 'expressauth@feathersjs.com', - password: 'secret', - provider: 'rest' - } - ) -}) diff --git a/packages/authentication-client/test/integration/fixture.ts b/packages/authentication-client/test/integration/fixture.ts deleted file mode 100644 index 1ecef9f9b0..0000000000 --- a/packages/authentication-client/test/integration/fixture.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { authenticate } from '@feathersjs/authentication' -import { HookContext, Application } from '@feathersjs/feathers' -import { memory } from '@feathersjs/memory' -import { AuthenticationService, JWTStrategy } from '@feathersjs/authentication' -import { LocalStrategy, hooks } from '@feathersjs/authentication-local' - -const { hashPassword, protect } = hooks - -export default (app: Application) => { - const authentication = new AuthenticationService(app) - - app.set('authentication', { - entity: 'user', - service: 'users', - secret: 'supersecret', - authStrategies: ['local', 'jwt'], - local: { - usernameField: 'email', - passwordField: 'password' - } - }) - - authentication.register('jwt', new JWTStrategy()) - authentication.register('local', new LocalStrategy()) - - app.use('/authentication', authentication) - app.use( - '/users', - memory({ - paginate: { - default: 10, - max: 20 - } - }) - ) - - app.service('users').hooks({ - before: { - create: hashPassword('password') - }, - after: protect('password') - }) - - app.use('/dummy', { - find(params) { - return Promise.resolve(params) - } - }) - - app.service('dummy').hooks({ - before: authenticate('jwt') - }) - - app.service('users').hooks({ - before(context: HookContext) { - if (context.id !== undefined && context.id !== null) { - context.id = parseInt(context.id as string, 10) - } - - return context - } - }) - - return app -} diff --git a/packages/authentication-client/test/integration/socketio.test.ts b/packages/authentication-client/test/integration/socketio.test.ts deleted file mode 100644 index d6070e5259..0000000000 --- a/packages/authentication-client/test/integration/socketio.test.ts +++ /dev/null @@ -1,100 +0,0 @@ -import { io } from 'socket.io-client' -import assert from 'assert' -import { feathers, Application } 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' - -describe('@feathersjs/authentication-client Socket.io integration', () => { - let app: Application - - before(async () => { - app = getApp(feathers().configure(socketio())) - - await app.listen(9777) - }) - - after((done) => { - app.io.close(() => done()) - }) - - it('allows to authenticate with handshake headers and sends login event', async () => { - const user = { email: 'authtest@example.com', password: 'alsosecret' } - - await app.service('users').create(user) - - const { accessToken } = await app.service('authentication').create({ - strategy: 'local', - ...user - }) - - const socket = io('http://localhost:9777', { - transports: ['websocket'], - transportOptions: { - websocket: { - extraHeaders: { - Authorization: `Bearer ${accessToken}` - } - } - } - }) - const authResult: any = await new Promise((resolve) => app.once('login', (res) => resolve(res))) - - assert.strictEqual(authResult.accessToken, accessToken) - - const dummy: any = await new Promise((resolve, reject) => { - socket.emit('find', 'dummy', {}, (error: Error, page: any) => (error ? reject(error) : resolve(page))) - }) - - assert.strictEqual(dummy.user.email, user.email) - assert.strictEqual(dummy.authentication.accessToken, accessToken) - assert.strictEqual(dummy.headers.authorization, `Bearer ${accessToken}`) - }) - - it('reconnects after socket disconnection', async () => { - const user = { email: 'disconnecttest@example.com', password: 'alsosecret' } - const socket = io('http://localhost:9777', { - timeout: 500, - reconnection: true, - reconnectionDelay: 100 - }) - const client = feathers().configure(socketioClient(socket)).configure(authClient()) - - await app.service('users').create(user) - await client.authenticate({ - strategy: 'local', - ...user - }) - - const onLogin = new Promise((resolve) => app.once('login', (data) => resolve(data))) - - socket.once('disconnect', () => socket.connect()) - socket.disconnect() - - const { - authentication: { strategy } - } = await onLogin - const dummy = await client.service('dummy').find() - - assert.strictEqual(strategy, 'jwt') - assert.strictEqual(dummy.user.email, user.email) - }) - - commonTests( - () => app, - () => { - return feathers() - .configure(socketioClient(io('http://localhost:9777'))) - .configure(authClient()) - }, - { - email: 'socketioauth@feathersjs.com', - password: 'secretive', - provider: 'socketio' - } - ) -}) diff --git a/packages/authentication-client/tsconfig.json b/packages/authentication-client/tsconfig.json deleted file mode 100644 index 316fd41336..0000000000 --- a/packages/authentication-client/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig", - "include": [ - "src/**/*.ts" - ], - "compilerOptions": { - "outDir": "lib" - } -} diff --git a/packages/authentication-local/CHANGELOG.md b/packages/authentication-local/CHANGELOG.md deleted file mode 100644 index 6a4c92b758..0000000000 --- a/packages/authentication-local/CHANGELOG.md +++ /dev/null @@ -1,849 +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.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/authentication-local - -## [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/authentication-local - -## [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/authentication-local - -## [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/authentication-local - -## [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/authentication-local - -## [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/authentication-local - -## [5.0.25](https://github.com/feathersjs/feathers/compare/v5.0.24...v5.0.25) (2024-05-03) - -### Bug Fixes - -- Reduce usage of lodash ([#3455](https://github.com/feathersjs/feathers/issues/3455)) ([8ce807a](https://github.com/feathersjs/feathers/commit/8ce807a5ca53ff5b8d5107a0656c6329404e6e6c)) - -## [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/authentication-local - -## [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/authentication-local - -## [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/authentication-local - -## [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/authentication-local - -## [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/authentication-local - -## [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/authentication-local - -## [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/authentication-local - -## [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/authentication-local - -## [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/authentication-local - -## [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/authentication-local - -## [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/authentication-local - -## [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/authentication-local - -## [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/authentication-local - -## [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/authentication-local - -## [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/authentication-local - -## [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/authentication-local - -## [5.0.6](https://github.com/feathersjs/feathers/compare/v5.0.5...v5.0.6) (2023-06-15) - -### Bug Fixes - -- **authentication-local:** Local Auth - Nested username & Password fields ([#3091](https://github.com/feathersjs/feathers/issues/3091)) ([d135526](https://github.com/feathersjs/feathers/commit/d135526da18ecf2dc620b82820e1d09d8af5c0b5)) - -## [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/authentication-local - -## [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/authentication-local - -# [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/authentication-local - -# [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/authentication-local - -# [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/authentication-local - -# [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/authentication-local - -# [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/authentication-local - -# [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/authentication-local - -# [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/authentication-local - -# [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 @feathersjs/authentication-local - -# [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) - -### Features - -- **authentication-oauth:** Koa and transport independent oAuth authentication ([#2737](https://github.com/feathersjs/feathers/issues/2737)) ([9231525](https://github.com/feathersjs/feathers/commit/9231525a24bb790ba9c5d940f2867a9c727691c9)) - -# [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/authentication-local - -# [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/authentication-local - -# [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/authentication-local - -# [5.0.0-pre.24](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.23...v5.0.0-pre.24) (2022-06-21) - -### Features - -- **authentication-local:** Add passwordHash property resolver ([#2660](https://github.com/feathersjs/feathers/issues/2660)) ([b41279b](https://github.com/feathersjs/feathers/commit/b41279b55eea3771a6fa4983a37be2413287bbc6)) - -# [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/authentication-local - -# [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/authentication-local - -# [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/authentication-local - -# [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) - -### Features - -- **typescript:** Improve adapter typings ([#2605](https://github.com/feathersjs/feathers/issues/2605)) ([3b2ca0a](https://github.com/feathersjs/feathers/commit/3b2ca0a6a8e03e8390272c4d7e930b4bffdaacf5)) - -# [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/authentication-local - -# [5.0.0-pre.17](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.16...v5.0.0-pre.17) (2022-02-15) - -### Bug Fixes - -- **hooks:** Allow all built-in hooks to be used the async and regular way ([#2559](https://github.com/feathersjs/feathers/issues/2559)) ([8f9f631](https://github.com/feathersjs/feathers/commit/8f9f631e0ce89de349207db72def84e7ab496a4a)) - -# [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/authentication-local - -# [5.0.0-pre.15](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.14...v5.0.0-pre.15) (2021-11-27) - -### Bug Fixes - -- **typescript:** Overall typing improvements ([#2478](https://github.com/feathersjs/feathers/issues/2478)) ([b8eb804](https://github.com/feathersjs/feathers/commit/b8eb804158556d9651a8607e3c3fda15e0bfd110)) - -# [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/authentication-local - -# [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/authentication-local - -# [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/authentication-local - -# [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/authentication-local - -# [5.0.0-pre.10](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.9...v5.0.0-pre.10) (2021-09-19) - -### Bug Fixes - -- **authentication-local:** adds error handling for undefined/null password field ([#2444](https://github.com/feathersjs/feathers/issues/2444)) ([4323f98](https://github.com/feathersjs/feathers/commit/4323f9859a66a7fe3f7f15d81476bd81b735c226)) - -# [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/authentication-local - -# [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/authentication-local - -# [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/authentication-local - -# [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/authentication-local - -# [5.0.0-pre.5](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.4...v5.0.0-pre.5) (2021-06-23) - -### Bug Fixes - -- **hooks:** Migrate built-in hooks and allow backwards compatibility ([#2358](https://github.com/feathersjs/feathers/issues/2358)) ([759c5a1](https://github.com/feathersjs/feathers/commit/759c5a19327a731af965c3604119393b3d09a406)) -- **koa:** Use extended query parser for compatibility ([#2397](https://github.com/feathersjs/feathers/issues/2397)) ([b2944ba](https://github.com/feathersjs/feathers/commit/b2944bac3ec6d5ecc80dc518cd4e58093692db74)) - -### Features - -- **adapter-commons:** Add support for params.adapter option and move memory adapter to @feathersjs/memory ([#2367](https://github.com/feathersjs/feathers/issues/2367)) ([a43e7da](https://github.com/feathersjs/feathers/commit/a43e7da22b6b981a96d1321736ea9a0cb924fb4f)) - -# [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/authentication-local - -# [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)) - -### Features - -- **dependencies:** Remove direct debug dependency ([#2296](https://github.com/feathersjs/feathers/issues/2296)) ([501d416](https://github.com/feathersjs/feathers/commit/501d4164d30c6a126906dc640cdfdc82207ba34a)) - -# [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/authentication-local - -# [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/authentication-local - -# [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)) - -### Features - -- Feathers v5 core refactoring and features ([#2255](https://github.com/feathersjs/feathers/issues/2255)) ([2dafb7c](https://github.com/feathersjs/feathers/commit/2dafb7ce14ba57406aeec13d10ca45b1e709bee9)) - -# [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) - -**Note:** Version bump only for package @feathersjs/authentication-local - -# [5.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v4.5.4...v5.0.0-pre.0) (2020-05-19) - -**Note:** Version bump only for package @feathersjs/authentication-local - -## [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/authentication-local - -## [4.5.7](https://github.com/feathersjs/feathers/compare/v4.5.6...v4.5.7) (2020-07-24) - -### Bug Fixes - -- **authentication:** Add JWT getEntityQuery ([#2013](https://github.com/feathersjs/feathers/issues/2013)) ([e0e7fb5](https://github.com/feathersjs/feathers/commit/e0e7fb5162940fe776731283b40026c61d9c8a33)) - -## [4.5.6](https://github.com/feathersjs/feathers/compare/v4.5.5...v4.5.6) (2020-07-12) - -**Note:** Version bump only for package @feathersjs/authentication-local - -## [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/authentication-local - -## [4.5.4](https://github.com/feathersjs/feathers/compare/v4.5.3...v4.5.4) (2020-04-29) - -### Bug Fixes - -- **authentication-local:** Allow to hash passwords in array data ([#1936](https://github.com/feathersjs/feathers/issues/1936)) ([64705f5](https://github.com/feathersjs/feathers/commit/64705f5d9d4dc27f799da3a074efaf74379a3398)) - -## [4.5.3](https://github.com/feathersjs/feathers/compare/v4.5.2...v4.5.3) (2020-04-17) - -**Note:** Version bump only for package @feathersjs/authentication-local - -## [4.5.2](https://github.com/feathersjs/feathers/compare/v4.5.1...v4.5.2) (2020-03-04) - -### Bug Fixes - -- **test:** typo in password ([#1797](https://github.com/feathersjs/feathers/issues/1797)) ([dfba6ec](https://github.com/feathersjs/feathers/commit/dfba6ec2f21adf3aa739218cf870eaaaa5df6e9c)) - -## [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/authentication-local - -# [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/authentication-local - -## [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/authentication-local - -## [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/authentication-local - -# [4.4.0](https://github.com/feathersjs/feathers/compare/v4.3.11...v4.4.0) (2019-11-27) - -### Features - -- **authentication:** Add parseStrategies to allow separate strategies for creating JWTs and parsing headers ([#1708](https://github.com/feathersjs/feathers/issues/1708)) ([5e65629](https://github.com/feathersjs/feathers/commit/5e65629b924724c3e81d7c81df047e123d1c8bd7)) - -## [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/authentication-local - -## [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/authentication-local - -## [4.3.9](https://github.com/feathersjs/feathers/compare/v4.3.8...v4.3.9) (2019-10-26) - -**Note:** Version bump only for package @feathersjs/authentication-local - -## [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/authentication-local - -## [4.3.5](https://github.com/feathersjs/feathers/compare/v4.3.4...v4.3.5) (2019-10-07) - -**Note:** Version bump only for package @feathersjs/authentication-local - -## [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/authentication-local - -## [4.3.3](https://github.com/feathersjs/feathers/compare/v4.3.2...v4.3.3) (2019-09-21) - -### Bug Fixes - -- Small improvements in dependencies and code sturcture ([#1562](https://github.com/feathersjs/feathers/issues/1562)) ([42c13e2](https://github.com/feathersjs/feathers/commit/42c13e2)) - -## [4.3.2](https://github.com/feathersjs/feathers/compare/v4.3.1...v4.3.2) (2019-09-16) - -### Bug Fixes - -- LocalStrategy authenticates without username ([#1560](https://github.com/feathersjs/feathers/issues/1560)) ([2b258fd](https://github.com/feathersjs/feathers/commit/2b258fd)), closes [#1559](https://github.com/feathersjs/feathers/issues/1559) - -## [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/authentication-local - -# [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/authentication-local - -# [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/authentication-local - -# [4.3.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.2...v4.3.0-pre.3) (2019-08-19) - -### Bug Fixes - -- Update all dependencies ([7d53a00](https://github.com/feathersjs/feathers/commit/7d53a00)) - -# [4.3.0-pre.2](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.1...v4.3.0-pre.2) (2019-08-02) - -### Bug Fixes - -- Add method to reliably get default authentication service ([#1470](https://github.com/feathersjs/feathers/issues/1470)) ([e542cb3](https://github.com/feathersjs/feathers/commit/e542cb3)) - -# [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/authentication-local - -# [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/authentication-local - -# [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/authentication-local - -# [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) - -**Note:** Version bump only for package @feathersjs/authentication-local - -# [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 - -- Always require strategy parameter in authentication ([#1327](https://github.com/feathersjs/feathers/issues/1327)) ([d4a8021](https://github.com/feathersjs/feathers/commit/d4a8021)) -- Improve authentication parameter handling ([#1333](https://github.com/feathersjs/feathers/issues/1333)) ([6e77204](https://github.com/feathersjs/feathers/commit/6e77204)) -- Merge httpStrategies and authStrategies option ([#1308](https://github.com/feathersjs/feathers/issues/1308)) ([afa4d55](https://github.com/feathersjs/feathers/commit/afa4d55)) -- Rename jwtStrategies option to authStrategies ([#1305](https://github.com/feathersjs/feathers/issues/1305)) ([4aee151](https://github.com/feathersjs/feathers/commit/4aee151)) - -### Features - -- Change and *JWT methods to *accessToken ([#1304](https://github.com/feathersjs/feathers/issues/1304)) ([5ac826b](https://github.com/feathersjs/feathers/commit/5ac826b)) - -# [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 - -- Authentication core improvements ([#1260](https://github.com/feathersjs/feathers/issues/1260)) ([c5dc7a2](https://github.com/feathersjs/feathers/commit/c5dc7a2)) -- 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 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)) -- **package:** update debug to version 3.0.0 ([#31](https://github.com/feathersjs/feathers/issues/31)) ([f23d617](https://github.com/feathersjs/feathers/commit/f23d617)) - -### Features - -- @feathersjs/authentication-oauth ([#1299](https://github.com/feathersjs/feathers/issues/1299)) ([656bae7](https://github.com/feathersjs/feathers/commit/656bae7)) -- Add AuthenticationBaseStrategy and make authentication option handling more explicit ([#1284](https://github.com/feathersjs/feathers/issues/1284)) ([2667d92](https://github.com/feathersjs/feathers/commit/2667d92)) -- 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)) -- Authentication v3 local authentication ([#1211](https://github.com/feathersjs/feathers/issues/1211)) ([0fa5f7c](https://github.com/feathersjs/feathers/commit/0fa5f7c)) - -### BREAKING CHANGES - -- Update authentication strategies for @feathersjs/authentication v3 - -## [1.2.9](https://github.com/feathersjs/feathers/compare/@feathersjs/authentication-local@1.2.8...@feathersjs/authentication-local@1.2.9) (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)) - - - -## [1.2.8](https://github.com/feathersjs/feathers/compare/@feathersjs/authentication-local@1.2.7...@feathersjs/authentication-local@1.2.8) (2018-12-16) - -**Note:** Version bump only for package @feathersjs/authentication-local - - - -## [1.2.7](https://github.com/feathersjs/feathers/compare/@feathersjs/authentication-local@1.2.6...@feathersjs/authentication-local@1.2.7) (2018-10-26) - -**Note:** Version bump only for package @feathersjs/authentication-local - - - -## [1.2.6](https://github.com/feathersjs/feathers/compare/@feathersjs/authentication-local@1.2.5...@feathersjs/authentication-local@1.2.6) (2018-10-25) - -### 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)) - - - -## [1.2.5](https://github.com/feathersjs/feathers/compare/@feathersjs/authentication-local@1.2.4...@feathersjs/authentication-local@1.2.5) (2018-09-21) - -**Note:** Version bump only for package @feathersjs/authentication-local - - - -## [1.2.4](https://github.com/feathersjs/feathers/compare/@feathersjs/authentication-local@1.2.3...@feathersjs/authentication-local@1.2.4) (2018-09-17) - -**Note:** Version bump only for package @feathersjs/authentication-local - - - -## [1.2.3](https://github.com/feathersjs/feathers/compare/@feathersjs/authentication-local@1.2.2...@feathersjs/authentication-local@1.2.3) (2018-09-02) - -**Note:** Version bump only for package @feathersjs/authentication-local - - - -## 1.2.2 - -- Migrate to Monorepo ([feathers#462](https://github.com/feathersjs/feathers/issues/462)) - -## [v1.2.1](https://github.com/feathersjs/authentication-local/tree/v1.2.1) (2018-05-02) - -[Full Changelog](https://github.com/feathersjs/authentication-local/compare/v1.2.0...v1.2.1) - -**Merged pull requests:** - -- Make sure the original object is not modified [\#65](https://github.com/feathersjs/authentication-local/pull/65) ([daffl](https://github.com/daffl)) - -## [v1.2.0](https://github.com/feathersjs/authentication-local/tree/v1.2.0) (2018-05-02) - -[Full Changelog](https://github.com/feathersjs/authentication-local/compare/v1.1.3...v1.2.0) - -**Merged pull requests:** - -- added support for nested password fields option in hash password hook [\#64](https://github.com/feathersjs/authentication-local/pull/64) ([ThePesta](https://github.com/ThePesta)) - -## [v1.1.3](https://github.com/feathersjs/authentication-local/tree/v1.1.3) (2018-04-20) - -[Full Changelog](https://github.com/feathersjs/authentication-local/compare/v1.1.2...v1.1.3) - -**Merged pull requests:** - -- Adding tests and calling to hasOwnProperty on Object.prototype instead of assuming valid prototype [\#63](https://github.com/feathersjs/authentication-local/pull/63) ([pmabres](https://github.com/pmabres)) - -## [v1.1.2](https://github.com/feathersjs/authentication-local/tree/v1.1.2) (2018-04-15) - -[Full Changelog](https://github.com/feathersjs/authentication-local/compare/v1.1.1...v1.1.2) - -**Closed issues:** - -- Protect hooks does not support dot notation [\#61](https://github.com/feathersjs/authentication-local/issues/61) - -**Merged pull requests:** - -- Use latest version of Lodash [\#62](https://github.com/feathersjs/authentication-local/pull/62) ([daffl](https://github.com/daffl)) - -## [v1.1.1](https://github.com/feathersjs/authentication-local/tree/v1.1.1) (2018-03-25) - -[Full Changelog](https://github.com/feathersjs/authentication-local/compare/v1.1.0...v1.1.1) - -**Closed issues:** - -- hash-password hook will skip users if they are missing password [\#58](https://github.com/feathersjs/authentication-local/issues/58) -- User service create method gets called upon each validation [\#56](https://github.com/feathersjs/authentication-local/issues/56) - -**Merged pull requests:** - -- Do not skip users that have no password [\#60](https://github.com/feathersjs/authentication-local/pull/60) ([daffl](https://github.com/daffl)) -- Update sinon to the latest version 🚀 [\#59](https://github.com/feathersjs/authentication-local/pull/59) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update sinon-chai to the latest version 🚀 [\#57](https://github.com/feathersjs/authentication-local/pull/57) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v1.1.0](https://github.com/feathersjs/authentication-local/tree/v1.1.0) (2018-01-23) - -[Full Changelog](https://github.com/feathersjs/authentication-local/compare/v1.0.4...v1.1.0) - -**Closed issues:** - -- protect hook attempts to map through 'result.data' on all service methods. [\#53](https://github.com/feathersjs/authentication-local/issues/53) -- Protect hook should check for toJSON [\#48](https://github.com/feathersjs/authentication-local/issues/48) - -**Merged pull requests:** - -- Use .toJSON if available [\#55](https://github.com/feathersjs/authentication-local/pull/55) ([daffl](https://github.com/daffl)) -- Only map data for find method [\#54](https://github.com/feathersjs/authentication-local/pull/54) ([daffl](https://github.com/daffl)) -- Update @feathersjs/authentication-jwt to the latest version 🚀 [\#52](https://github.com/feathersjs/authentication-local/pull/52) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update mocha to the latest version 🚀 [\#51](https://github.com/feathersjs/authentication-local/pull/51) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v1.0.4](https://github.com/feathersjs/authentication-local/tree/v1.0.4) (2018-01-03) - -[Full Changelog](https://github.com/feathersjs/authentication-local/compare/v1.0.3...v1.0.4) - -## [v1.0.3](https://github.com/feathersjs/authentication-local/tree/v1.0.3) (2018-01-03) - -[Full Changelog](https://github.com/feathersjs/authentication-local/compare/v1.0.2...v1.0.3) - -**Closed issues:** - -- local authentication bug with users as sequelize service [\#47](https://github.com/feathersjs/authentication-local/issues/47) - -**Merged pull requests:** - -- Update documentation to correspond with latest release [\#50](https://github.com/feathersjs/authentication-local/pull/50) ([daffl](https://github.com/daffl)) -- Update semistandard to the latest version 🚀 [\#49](https://github.com/feathersjs/authentication-local/pull/49) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v1.0.2](https://github.com/feathersjs/authentication-local/tree/v1.0.2) (2017-12-06) - -[Full Changelog](https://github.com/feathersjs/authentication-local/compare/v1.0.1...v1.0.2) - -**Closed issues:** - -- why is the password send as plain text instead of encrypting it on client side? [\#44](https://github.com/feathersjs/authentication-local/issues/44) - -**Merged pull requests:** - -- Update hook.result if an external provider is set [\#46](https://github.com/feathersjs/authentication-local/pull/46) ([daffl](https://github.com/daffl)) -- Update feathers-memory to the latest version 🚀 [\#45](https://github.com/feathersjs/authentication-local/pull/45) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v1.0.1](https://github.com/feathersjs/authentication-local/tree/v1.0.1) (2017-11-16) - -[Full Changelog](https://github.com/feathersjs/authentication-local/compare/v1.0.0...v1.0.1) - -**Merged pull requests:** - -- Add default export for better ES module \(TypeScript\) compatibility [\#43](https://github.com/feathersjs/authentication-local/pull/43) ([daffl](https://github.com/daffl)) -- Update @feathersjs/authentication to the latest version 🚀 [\#42](https://github.com/feathersjs/authentication-local/pull/42) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v1.0.0](https://github.com/feathersjs/authentication-local/tree/v1.0.0) (2017-11-01) - -[Full Changelog](https://github.com/feathersjs/authentication-local/compare/v1.0.0-pre.2...v1.0.0) - -**Merged pull requests:** - -- Update dependencies for release [\#41](https://github.com/feathersjs/authentication-local/pull/41) ([daffl](https://github.com/daffl)) - -## [v1.0.0-pre.2](https://github.com/feathersjs/authentication-local/tree/v1.0.0-pre.2) (2017-10-27) - -[Full Changelog](https://github.com/feathersjs/authentication-local/compare/v1.0.0-pre.1...v1.0.0-pre.2) - -**Merged pull requests:** - -- Safely dispatch without password [\#40](https://github.com/feathersjs/authentication-local/pull/40) ([daffl](https://github.com/daffl)) - -## [v1.0.0-pre.1](https://github.com/feathersjs/authentication-local/tree/v1.0.0-pre.1) (2017-10-25) - -[Full Changelog](https://github.com/feathersjs/authentication-local/compare/v0.4.4...v1.0.0-pre.1) - -**Closed issues:** - -- How configure local strategy to feathers-authentication? [\#36](https://github.com/feathersjs/authentication-local/issues/36) -- An in-range update of feathers is breaking the build 🚨 [\#32](https://github.com/feathersjs/authentication-local/issues/32) - -**Merged pull requests:** - -- Update to Feathers v3 [\#39](https://github.com/feathersjs/authentication-local/pull/39) ([daffl](https://github.com/daffl)) -- Rename repository and use npm scope [\#38](https://github.com/feathersjs/authentication-local/pull/38) ([daffl](https://github.com/daffl)) -- Update to new plugin infrastructure [\#37](https://github.com/feathersjs/authentication-local/pull/37) ([daffl](https://github.com/daffl)) -- Update mocha to the latest version 🚀 [\#35](https://github.com/feathersjs/authentication-local/pull/35) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update sinon to the latest version 🚀 [\#34](https://github.com/feathersjs/authentication-local/pull/34) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Add babel-polyfill and package-lock.json [\#33](https://github.com/feathersjs/authentication-local/pull/33) ([daffl](https://github.com/daffl)) -- Update sinon to the latest version 🚀 [\#29](https://github.com/feathersjs/authentication-local/pull/29) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v0.4.4](https://github.com/feathersjs/authentication-local/tree/v0.4.4) (2017-08-11) - -[Full Changelog](https://github.com/feathersjs/authentication-local/compare/v0.4.3...v0.4.4) - -**Closed issues:** - -- i18n support [\#28](https://github.com/feathersjs/authentication-local/issues/28) -- Couldn't store jwt token in cookies [\#17](https://github.com/feathersjs/authentication-local/issues/17) -- Strategy for subapp [\#9](https://github.com/feathersjs/authentication-local/issues/9) - -**Merged pull requests:** - -- Update debug to the latest version 🚀 [\#31](https://github.com/feathersjs/authentication-local/pull/31) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Increase bcrypt cost factor, add future cost factor auto-optimization [\#30](https://github.com/feathersjs/authentication-local/pull/30) ([micaksica2](https://github.com/micaksica2)) - -## [v0.4.3](https://github.com/feathersjs/authentication-local/tree/v0.4.3) (2017-06-22) - -[Full Changelog](https://github.com/feathersjs/authentication-local/compare/v0.4.2...v0.4.3) - -**Closed issues:** - -- Log a warning if service.id is undefined or null [\#19](https://github.com/feathersjs/authentication-local/issues/19) - -**Merged pull requests:** - -- throw error if service.id is missing [\#27](https://github.com/feathersjs/authentication-local/pull/27) ([marshallswain](https://github.com/marshallswain)) - -## [v0.4.2](https://github.com/feathersjs/authentication-local/tree/v0.4.2) (2017-06-22) - -[Full Changelog](https://github.com/feathersjs/authentication-local/compare/v0.4.1...v0.4.2) - -## [v0.4.1](https://github.com/feathersjs/authentication-local/tree/v0.4.1) (2017-06-22) - -[Full Changelog](https://github.com/feathersjs/authentication-local/compare/v0.4.0...v0.4.1) - -**Merged pull requests:** - -- Resolves \#14 - Passes Feathers params to service hooks [\#15](https://github.com/feathersjs/authentication-local/pull/15) ([thomas-p-wilson](https://github.com/thomas-p-wilson)) - -## [v0.4.0](https://github.com/feathersjs/authentication-local/tree/v0.4.0) (2017-06-22) - -[Full Changelog](https://github.com/feathersjs/authentication-local/compare/v0.3.4...v0.4.0) - -**Closed issues:** - -- Module is using the wrong default config key [\#21](https://github.com/feathersjs/authentication-local/issues/21) -- Feathers params not available to user service hooks [\#14](https://github.com/feathersjs/authentication-local/issues/14) -- Bad error message is returned for invalid credentials [\#10](https://github.com/feathersjs/authentication-local/issues/10) - -**Merged pull requests:** - -- Greenkeeper/chai 4.0.2 [\#26](https://github.com/feathersjs/authentication-local/pull/26) ([daffl](https://github.com/daffl)) -- Return Invalid login message when user doesn’t exist [\#25](https://github.com/feathersjs/authentication-local/pull/25) ([marshallswain](https://github.com/marshallswain)) -- Adding separate entity username and password fields [\#23](https://github.com/feathersjs/authentication-local/pull/23) ([adamvr](https://github.com/adamvr)) -- use the correct default config key. Closes \#21 [\#22](https://github.com/feathersjs/authentication-local/pull/22) ([ekryski](https://github.com/ekryski)) -- Update feathers-socketio to the latest version 🚀 [\#20](https://github.com/feathersjs/authentication-local/pull/20) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update semistandard to the latest version 🚀 [\#18](https://github.com/feathersjs/authentication-local/pull/18) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update feathers-hooks to the latest version 🚀 [\#16](https://github.com/feathersjs/authentication-local/pull/16) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update dependencies to enable Greenkeeper 🌴 [\#13](https://github.com/feathersjs/authentication-local/pull/13) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v0.3.4](https://github.com/feathersjs/authentication-local/tree/v0.3.4) (2017-03-28) - -[Full Changelog](https://github.com/feathersjs/authentication-local/compare/v0.3.3...v0.3.4) - -**Closed issues:** - -- Shouldn't it be `authentication` instead of the old `auth` there? [\#11](https://github.com/feathersjs/authentication-local/issues/11) - -**Merged pull requests:** - -- Fix default authentication config name [\#12](https://github.com/feathersjs/authentication-local/pull/12) ([marshallswain](https://github.com/marshallswain)) - -## [v0.3.3](https://github.com/feathersjs/authentication-local/tree/v0.3.3) (2017-01-27) - -[Full Changelog](https://github.com/feathersjs/authentication-local/compare/v0.3.2...v0.3.3) - -**Closed issues:** - -- Support dot notation [\#7](https://github.com/feathersjs/authentication-local/issues/7) -- Automatically register the authenticate hook with 'local' [\#4](https://github.com/feathersjs/authentication-local/issues/4) - -**Merged pull requests:** - -- Add support for dot notation, fix some whitespace [\#8](https://github.com/feathersjs/authentication-local/pull/8) ([elfey](https://github.com/elfey)) - -## [v0.3.2](https://github.com/feathersjs/authentication-local/tree/v0.3.2) (2016-12-14) - -[Full Changelog](https://github.com/feathersjs/authentication-local/compare/v0.3.1...v0.3.2) - -## [v0.3.1](https://github.com/feathersjs/authentication-local/tree/v0.3.1) (2016-12-14) - -[Full Changelog](https://github.com/feathersjs/authentication-local/compare/v0.3.0...v0.3.1) - -**Closed issues:** - -- Add docs section on expected request params. [\#5](https://github.com/feathersjs/authentication-local/issues/5) - -**Merged pull requests:** - -- Document expected request data [\#6](https://github.com/feathersjs/authentication-local/pull/6) ([marshallswain](https://github.com/marshallswain)) - -## [v0.3.0](https://github.com/feathersjs/authentication-local/tree/v0.3.0) (2016-11-23) - -[Full Changelog](https://github.com/feathersjs/authentication-local/compare/v0.2.0...v0.3.0) - -**Closed issues:** - -- Doesn't pull configuration from `auth.local` by default [\#2](https://github.com/feathersjs/authentication-local/issues/2) -- Does not pull from global auth config when strategy has a custom name [\#1](https://github.com/feathersjs/authentication-local/issues/1) - -**Merged pull requests:** - -- Payload support [\#3](https://github.com/feathersjs/authentication-local/pull/3) ([ekryski](https://github.com/ekryski)) - -## [v0.2.0](https://github.com/feathersjs/authentication-local/tree/v0.2.0) (2016-11-16) - -[Full Changelog](https://github.com/feathersjs/authentication-local/compare/v0.1.0...v0.2.0) - -## [v0.1.0](https://github.com/feathersjs/authentication-local/tree/v0.1.0) (2016-11-09) - -\* _This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)_ diff --git a/packages/authentication-local/LICENSE b/packages/authentication-local/LICENSE deleted file mode 100644 index 7712f870f3..0000000000 --- a/packages/authentication-local/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2024 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 -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -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 deleted file mode 100644 index 9215940bd5..0000000000 --- a/packages/authentication-local/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# @feathersjs/authentication-local - -[![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/authentication-local.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/authentication-local) -[![Discord](https://badgen.net/badge/icon/discord?icon=discord&label)](https://discord.gg/qa8kez8QBx) - -> Local username and password authentication strategy for Feathers authentication - -## Installation - -``` -npm install @feathersjs/authentication-local --save -``` - -## Documentation - -Refer to the [Feathers local authentication API documentation](https://feathersjs.com/api/authentication/local.html) 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/authentication-local/package.json b/packages/authentication-local/package.json deleted file mode 100644 index 5ca85281a3..0000000000 --- a/packages/authentication-local/package.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "name": "@feathersjs/authentication-local", - "description": "Local authentication strategy for @feathers/authentication", - "version": "5.0.34", - "homepage": "https://feathersjs.com", - "main": "lib/", - "types": "lib/", - "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", - "directory": "packages/authentication-local" - }, - "author": { - "name": "Feathers contributors", - "email": "hello@feathersjs.com", - "url": "https://feathersjs.com" - }, - "contributors": [], - "bugs": { - "url": "https://github.com/feathersjs/feathers/issues" - }, - "engines": { - "node": ">= 12" - }, - "files": [ - "CHANGELOG.md", - "LICENSE", - "README.md", - "src/**", - "lib/**", - "*.d.ts", - "*.js" - ], - "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" - }, - "directories": { - "lib": "lib" - }, - "publishConfig": { - "access": "public" - }, - "dependencies": { - "@feathersjs/authentication": "^5.0.34", - "@feathersjs/commons": "^5.0.34", - "@feathersjs/errors": "^5.0.34", - "@feathersjs/feathers": "^5.0.34", - "bcryptjs": "^3.0.2", - "lodash": "^4.17.21" - }, - "devDependencies": { - "@feathersjs/memory": "^5.0.34", - "@feathersjs/schema": "^5.0.34", - "@types/bcryptjs": "^2.4.6", - "@types/lodash": "^4.17.20", - "@types/mocha": "^10.0.10", - "@types/node": "^24.1.0", - "mocha": "^11.7.1", - "shx": "^0.4.0", - "ts-node": "^10.9.2", - "typescript": "^5.9.2" - }, - "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" -} diff --git a/packages/authentication-local/src/hooks/hash-password.ts b/packages/authentication-local/src/hooks/hash-password.ts deleted file mode 100644 index 5a949bb856..0000000000 --- a/packages/authentication-local/src/hooks/hash-password.ts +++ /dev/null @@ -1,67 +0,0 @@ -import get from 'lodash/get' -import set from 'lodash/set' -import cloneDeep from 'lodash/cloneDeep' -import { BadRequest } from '@feathersjs/errors' -import { createDebug } from '@feathersjs/commons' -import { HookContext, NextFunction } from '@feathersjs/feathers' -import { LocalStrategy } from '../strategy' - -const debug = createDebug('@feathersjs/authentication-local/hooks/hash-password') - -export interface HashPasswordOptions { - authentication?: string - strategy?: string -} - -/** - * @deprecated Use Feathers schema resolvers and the `passwordHash` resolver instead - * @param field - * @param options - * @returns - * @see https://dove.feathersjs.com/api/authentication/local.html#passwordhash - */ -export default function hashPassword(field: string, options: HashPasswordOptions = {}) { - if (!field) { - throw new Error('The hashPassword hook requires a field name option') - } - - return async (context: HookContext, next?: NextFunction) => { - const { app, data, params } = context - - if (data !== undefined) { - const authService = app.defaultAuthentication(options.authentication) - const { strategy = 'local' } = options - - if (!authService || typeof authService.getStrategies !== 'function') { - throw new BadRequest('Could not find an authentication service to hash password') - } - - const [localStrategy] = authService.getStrategies(strategy) as LocalStrategy[] - - if (!localStrategy || typeof localStrategy.hashPassword !== 'function') { - throw new BadRequest(`Could not find '${strategy}' strategy to hash password`) - } - - const addHashedPassword = async (data: any) => { - const password = get(data, field) - - if (password === undefined) { - debug(`hook.data.${field} is undefined, not hashing password`) - return data - } - - const hashedPassword: string = await localStrategy.hashPassword(password, params) - - return set(cloneDeep(data), field, hashedPassword) - } - - context.data = Array.isArray(data) - ? await Promise.all(data.map(addHashedPassword)) - : await addHashedPassword(data) - } - - if (typeof next === 'function') { - return next() - } - } -} diff --git a/packages/authentication-local/src/hooks/protect.ts b/packages/authentication-local/src/hooks/protect.ts deleted file mode 100644 index eb1657e942..0000000000 --- a/packages/authentication-local/src/hooks/protect.ts +++ /dev/null @@ -1,42 +0,0 @@ -import omit from 'lodash/omit' -import { 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 - */ -export default (...fields: string[]) => { - const o = (current: any) => { - if (typeof current === 'object' && !Array.isArray(current)) { - const data = typeof current.toJSON === 'function' ? current.toJSON() : current - - return omit(data, fields) - } - - return current - } - - return async (context: HookContext, next?: NextFunction) => { - if (typeof next === 'function') { - await next() - } - - const result = context.dispatch || context.result - - if (result) { - if (Array.isArray(result)) { - context.dispatch = result.map(o) - } else if (result.data && context.method === 'find') { - context.dispatch = Object.assign({}, result, { - data: result.data.map(o) - }) - } else { - context.dispatch = o(result) - } - - if (context.params && context.params.provider) { - context.result = context.dispatch - } - } - } -} diff --git a/packages/authentication-local/src/index.ts b/packages/authentication-local/src/index.ts deleted file mode 100644 index 5e9b827e73..0000000000 --- a/packages/authentication-local/src/index.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { HookContext } from '@feathersjs/feathers' -import hashPassword from './hooks/hash-password' -import protect from './hooks/protect' -import { LocalStrategy } from './strategy' - -export const hooks = { hashPassword, protect } -export { LocalStrategy } - -/** - * Returns as property resolver that hashes a given plain text password using a Local - * authentication strategy. - * - * @param options The authentication `service` and `strategy` name - * @returns - */ -export const passwordHash = - (options: { service?: string; strategy: string }) => - async >(value: string | undefined, _data: any, context: H) => { - if (value === undefined) { - return value - } - - const { app, params } = context - const authService = app.defaultAuthentication(options.service) - const localStrategy = authService.getStrategy(options.strategy) as LocalStrategy - - return localStrategy.hashPassword(value, params) - } diff --git a/packages/authentication-local/src/strategy.ts b/packages/authentication-local/src/strategy.ts deleted file mode 100644 index 86129792b2..0000000000 --- a/packages/authentication-local/src/strategy.ts +++ /dev/null @@ -1,142 +0,0 @@ -/* eslint-disable @typescript-eslint/no-unused-vars */ -import bcrypt from 'bcryptjs' -import get from 'lodash/get' -import { NotAuthenticated } from '@feathersjs/errors' -import { Query, Params } from '@feathersjs/feathers' -import { AuthenticationRequest, AuthenticationBaseStrategy } from '@feathersjs/authentication' -import { createDebug } from '@feathersjs/commons' - -const debug = createDebug('@feathersjs/authentication-local/strategy') - -export class LocalStrategy extends AuthenticationBaseStrategy { - verifyConfiguration() { - const config = this.configuration - - ;['usernameField', 'passwordField'].forEach((prop) => { - if (typeof config[prop] !== 'string') { - throw new Error(`'${this.name}' authentication strategy requires a '${prop}' setting`) - } - }) - } - - get configuration() { - const authConfig = this.authentication.configuration - const config = super.configuration || {} - - return { - hashSize: 10, - service: authConfig.service, - entity: authConfig.entity, - entityId: authConfig.entityId, - errorMessage: 'Invalid login', - entityPasswordField: config.passwordField, - entityUsernameField: config.usernameField, - ...config - } - } - - async getEntityQuery(query: Query, _params: Params) { - return { - $limit: 1, - ...query - } - } - - async findEntity(username: string, params: Params) { - const { entityUsernameField, errorMessage } = this.configuration - if (!username) { - // don't query for users without any condition set. - throw new NotAuthenticated(errorMessage) - } - - const query = await this.getEntityQuery( - { - [entityUsernameField]: username - }, - params - ) - - const findParams = Object.assign({}, params, { query }) - const entityService = this.entityService - - debug('Finding entity with query', params.query) - - const result = await entityService.find(findParams) - const list = Array.isArray(result) ? result : result.data - - if (!Array.isArray(list) || list.length === 0) { - debug('No entity found') - - throw new NotAuthenticated(errorMessage) - } - - const [entity] = list - - return entity - } - - async getEntity(result: any, params: Params) { - const entityService = this.entityService - const { entityId = (entityService as any).id, entity } = this.configuration - - if (!entityId || result[entityId] === undefined) { - throw new NotAuthenticated('Could not get local entity') - } - - if (!params.provider) { - return result - } - - return entityService.get(result[entityId], { - ...params, - [entity]: result - }) - } - - async comparePassword(entity: any, password: string) { - const { entityPasswordField, errorMessage } = this.configuration - // find password in entity, this allows for dot notation - const hash = get(entity, entityPasswordField) - - if (!hash) { - debug(`Record is missing the '${entityPasswordField}' password field`) - - throw new NotAuthenticated(errorMessage) - } - - debug('Verifying password') - - const result = await bcrypt.compare(password, hash) - - if (result) { - return entity - } - - throw new NotAuthenticated(errorMessage) - } - - async hashPassword(password: string, _params: Params) { - return bcrypt.hash(password, this.configuration.hashSize) - } - - async authenticate(data: AuthenticationRequest, params: Params) { - const { passwordField, usernameField, entity, errorMessage } = this.configuration - const username = get(data, usernameField) - const password = get(data, passwordField) - - if (!password) { - // exit early if there is no password - throw new NotAuthenticated(errorMessage) - } - - const { provider, ...paramsWithoutProvider } = params - - const result = await this.findEntity(username, paramsWithoutProvider) - await this.comparePassword(result, password) - - return { - authentication: { strategy: this.name }, - [entity]: await this.getEntity(result, params) - } - } -} diff --git a/packages/authentication-local/test/fixture.ts b/packages/authentication-local/test/fixture.ts deleted file mode 100644 index 32be7b476b..0000000000 --- a/packages/authentication-local/test/fixture.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { feathers } from '@feathersjs/feathers' -import { memory, MemoryService } from '@feathersjs/memory' -import { AuthenticationService, JWTStrategy } from '@feathersjs/authentication' - -import { LocalStrategy, hooks } from '../src' -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/authentication-local/test/hooks/hash-password.test.ts b/packages/authentication-local/test/hooks/hash-password.test.ts deleted file mode 100644 index fb45bc928e..0000000000 --- a/packages/authentication-local/test/hooks/hash-password.test.ts +++ /dev/null @@ -1,91 +0,0 @@ -/* 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' - -const { hashPassword } = hooks - -describe('@feathersjs/authentication-local/hooks/hash-password', () => { - let app: Application - - beforeEach(() => { - app = createApplication() - }) - - it('throws error when no field provided', () => { - try { - // @ts-ignore - hashPassword() - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.message, 'The hashPassword hook requires a field name option') - } - }) - - it('errors when authentication service does not exist', async () => { - delete app.services.authentication - - try { - await app.service('users').create({ - email: 'dave@hashpassword.com', - password: 'supersecret' - }) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.message, 'Could not find an authentication service to hash password') - } - }) - - it('errors when authentication strategy does not exist', async () => { - delete app.services.authentication.strategies.local - - try { - await app.service('users').create({ - email: 'dave@hashpassword.com', - password: 'supersecret' - }) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.message, "Could not find 'local' strategy to hash password") - } - }) - - it('hashes password on field', async () => { - const password = 'supersecret' - - const user = await app.service('users').create({ - email: 'dave@hashpassword.com', - password - }) - - assert.notStrictEqual(user.password, password) - }) - - it('hashes password on array data', async () => { - const password = 'supersecret' - - const users = await app.service('users').create([ - { - email: 'dave@hashpassword.com', - password - }, - { - email: 'dave2@hashpassword.com', - password: 'secret2' - } - ]) - - assert.notStrictEqual(users[0].password, password) - assert.notStrictEqual(users[1].password, 'secret2') - }) - - it('does nothing when field is not present', async () => { - const user = await app.service('users').create({ - email: 'dave@hashpassword.com' - }) - - assert.strictEqual(user.password, undefined) - }) -}) diff --git a/packages/authentication-local/test/hooks/protect.test.ts b/packages/authentication-local/test/hooks/protect.test.ts deleted file mode 100644 index 20e1320c3d..0000000000 --- a/packages/authentication-local/test/hooks/protect.test.ts +++ /dev/null @@ -1,183 +0,0 @@ -import assert from 'assert' -import { HookContext } from '@feathersjs/feathers' -import { hooks } from '../../src' - -const { protect } = hooks - -function testOmit(title: string, property: string) { - describe(title, () => { - const fn = protect('password') - - it('omits from object', async () => { - const data = { - email: 'test@user.com', - password: 'supersecret' - } - const context = { - [property]: data - } as unknown as HookContext - - await fn(context) - - assert.deepStrictEqual(context, { - [property]: data, - dispatch: { email: 'test@user.com' } - }) - }) - - it('omits from nested object', async () => { - const hook = protect('user.password') - const data = { - user: { - email: 'test@user.com', - password: 'supersecret' - } - } - const context = { - [property]: data - } as unknown as HookContext - - await hook(context) - - assert.deepStrictEqual(context, { - [property]: data, - dispatch: { user: { email: 'test@user.com' } } - }) - }) - - it('handles `data` property only for find', async () => { - const data = { - email: 'test@user.com', - password: 'supersecret', - data: 'yes' - } - const context = { - [property]: data - } as unknown as HookContext - - await fn(context) - - assert.deepStrictEqual(context, { - [property]: data, - dispatch: { email: 'test@user.com', data: 'yes' } - }) - }) - - it('uses .toJSON (#48)', async () => { - class MyUser { - toJSON() { - return { - email: 'test@user.com', - password: 'supersecret' - } - } - } - - const data = new MyUser() - const context = { - [property]: data - } as unknown as HookContext - - await fn(context) - - assert.deepStrictEqual(context, { - [property]: data, - dispatch: { email: 'test@user.com' } - }) - }) - - it('omits from array but only objects (#2053)', async () => { - const data = [ - { - email: 'test1@user.com', - password: 'supersecret' - }, - { - email: 'test2@user.com', - password: 'othersecret' - }, - ['one', 'two', 'three'], - 'test' - ] - const context = { - [property]: data - } as unknown as HookContext - - await fn(context) - - assert.deepStrictEqual(context, { - [property]: data, - dispatch: [{ email: 'test1@user.com' }, { email: 'test2@user.com' }, ['one', 'two', 'three'], 'test'] - }) - }) - - it('omits from pagination object', async () => { - const data = { - total: 2, - data: [ - { - email: 'test1@user.com', - password: 'supersecret' - }, - { - email: 'test2@user.com', - password: 'othersecret' - } - ] - } - const context = { - method: 'find', - [property]: data - } as unknown as HookContext - - await fn(context) - - assert.deepStrictEqual(context, { - method: 'find', - [property]: data, - dispatch: { - total: 2, - data: [{ email: 'test1@user.com' }, { email: 'test2@user.com' }] - } - }) - }) - - it('updates result if params.provider is set', async () => { - const data = [ - { - email: 'test1@user.com', - password: 'supersecret' - }, - { - email: 'test2@user.com', - password: 'othersecret' - } - ] - const params = { provider: 'test' } - const context = { - [property]: data, - params - } as unknown as HookContext - - await fn(context) - - assert.deepStrictEqual(context, { - [property]: data, - params, - result: [{ email: 'test1@user.com' }, { email: 'test2@user.com' }], - dispatch: [{ email: 'test1@user.com' }, { email: 'test2@user.com' }] - }) - }) - }) -} - -describe('@feathersjs/authentication-local/hooks/protect', () => { - it('does nothing when called with no result', async () => { - const fn = protect() - - assert.deepStrictEqual(await fn({} as any), undefined) - }) - - testOmit('with hook.result', 'result') - testOmit('with hook.dispatch already set', 'dispatch') -}) diff --git a/packages/authentication-local/test/strategy.test.ts b/packages/authentication-local/test/strategy.test.ts deleted file mode 100644 index a8fca0fe16..0000000000 --- a/packages/authentication-local/test/strategy.test.ts +++ /dev/null @@ -1,224 +0,0 @@ -import assert from 'assert' -import omit from 'lodash/omit' -import { Application, HookContext } from '@feathersjs/feathers' -import { resolve } from '@feathersjs/schema' - -import { LocalStrategy, passwordHash } from '../src' -import { createApplication, ServiceTypes } from './fixture' - -describe('@feathersjs/authentication-local/strategy', () => { - const password = 'localsecret' - const email = 'localtester@feathersjs.com' - - let app: Application - let user: any - - beforeEach(async () => { - app = createApplication() - user = await app.service('users').create({ email, password }) - }) - - it('throw error when configuration is not set', () => { - const auth = app.service('authentication') - - try { - auth.register('something', new LocalStrategy()) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual( - error.message, - "'something' authentication strategy requires a 'usernameField' setting" - ) - } - }) - - it('fails when entity not found', async () => { - const authService = app.service('authentication') - - try { - await authService.create({ - strategy: 'local', - email: 'not in database', - password - }) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotAuthenticated') - assert.strictEqual(error.message, 'Invalid login') - } - }) - - it('getEntity', async () => { - const [strategy] = app.service('authentication').getStrategies('local') as [LocalStrategy] - let entity = await strategy.getEntity(user, {}) - - assert.deepStrictEqual(entity, user) - - entity = await strategy.getEntity(user, { - provider: 'testing' - }) - - assert.deepStrictEqual(entity, { - ...omit(user, 'password'), - fromGet: true - }) - - try { - await strategy.getEntity({}, {}) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.message, 'Could not get local entity') - } - }) - - it('strategy fails when strategy is different', async () => { - const [local] = app.service('authentication').getStrategies('local') - - await assert.rejects( - () => - local.authenticate( - { - strategy: 'not-me', - password: 'dummy', - email - }, - {} - ), - { - name: 'NotAuthenticated', - message: 'Invalid login' - } - ) - }) - - it('fails when password is wrong', async () => { - const authService = app.service('authentication') - try { - await authService.create({ - strategy: 'local', - email, - password: 'dummy' - }) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotAuthenticated') - assert.strictEqual(error.message, 'Invalid login') - } - }) - - it('fails when password is not provided', async () => { - const authService = app.service('authentication') - try { - await authService.create({ - strategy: 'local', - email - }) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotAuthenticated') - assert.strictEqual(error.message, 'Invalid login') - } - }) - - it('fails when password field is not available', async () => { - const userEmail = 'someuser@localtest.com' - const authService = app.service('authentication') - - try { - await app.service('users').create({ - email: userEmail - }) - await authService.create({ - strategy: 'local', - password: 'dummy', - email: userEmail - }) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotAuthenticated') - assert.strictEqual(error.message, 'Invalid login') - } - }) - - it('authenticates an existing user', async () => { - const authService = app.service('authentication') - const authResult = await authService.create({ - strategy: 'local', - email, - password - }) - const { accessToken } = authResult - - assert.ok(accessToken) - assert.strictEqual(authResult.user.email, email) - - const decoded = await authService.verifyAccessToken(accessToken) - - assert.strictEqual(decoded.sub, `${user.id}`) - }) - - it('returns safe result when params.provider is set, works without pagination', async () => { - const authService = app.service('authentication') - const authResult = await authService.create( - { - strategy: 'local', - email, - password - }, - { - provider: 'rest', - paginate: false - } - ) - const { accessToken } = authResult - - assert.ok(accessToken) - assert.strictEqual(authResult.user.email, email) - assert.strictEqual(authResult.user.password, undefined) - assert.ok(authResult.user.fromGet) - - const decoded = await authService.verifyAccessToken(accessToken) - - assert.strictEqual(decoded.sub, `${user.id}`) - }) - - it('passwordHash property resolver', async () => { - const userResolver = resolve<{ password: string }, HookContext>({ - properties: { - password: passwordHash({ - strategy: 'local' - }) - } - }) - - const resolvedData = await userResolver.resolve({ password: 'supersecret' }, { app } as HookContext) - - assert.notStrictEqual(resolvedData.password, 'supersecret') - }) - it('should allow for nested values in the usernameField', async () => { - const appWithNestedFieldOverride = createApplication(undefined, { - local: { - usernameField: 'auth.email', - passwordField: 'auth.password' - } - }) - const nestedUser = await appWithNestedFieldOverride.service('users').create({ auth: { email, password } }) - const authService = appWithNestedFieldOverride.service('authentication') - const authResult = await authService.create({ - strategy: 'local', - auth: { - email, - password - } - }) - const { accessToken } = authResult - - assert.ok(accessToken) - assert.strictEqual(authResult.user.auth.email, email) - - const decoded = await authService.verifyAccessToken(accessToken) - - assert.strictEqual(decoded.sub, `${nestedUser.id}`) - // - }) -}) diff --git a/packages/authentication-local/tsconfig.json b/packages/authentication-local/tsconfig.json deleted file mode 100644 index 316fd41336..0000000000 --- a/packages/authentication-local/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig", - "include": [ - "src/**/*.ts" - ], - "compilerOptions": { - "outDir": "lib" - } -} diff --git a/packages/authentication-oauth/CHANGELOG.md b/packages/authentication-oauth/CHANGELOG.md deleted file mode 100644 index d9bded45fe..0000000000 --- a/packages/authentication-oauth/CHANGELOG.md +++ /dev/null @@ -1,577 +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.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/authentication-oauth - -## [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/authentication-oauth - -## [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/authentication-oauth - -## [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/authentication-oauth - -## [5.0.27](https://github.com/feathersjs/feathers/compare/v5.0.26...v5.0.27) (2024-06-18) - -### Bug Fixes - -- **authentication-oauth:** Allow POST oauth callbacks ([#3497](https://github.com/feathersjs/feathers/issues/3497)) ([ffcc90b](https://github.com/feathersjs/feathers/commit/ffcc90bb95329cbb4b8f310e37024d417c216d8c)) - -## [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/authentication-oauth - -## [5.0.25](https://github.com/feathersjs/feathers/compare/v5.0.24...v5.0.25) (2024-05-03) - -### Bug Fixes - -- **oauth:** Export OAuthService type ([#3479](https://github.com/feathersjs/feathers/issues/3479)) ([e7185cd](https://github.com/feathersjs/feathers/commit/e7185cde63990a0d24a7180c63b61dbc8ef6cd5b)) -- Reduce usage of lodash ([#3455](https://github.com/feathersjs/feathers/issues/3455)) ([8ce807a](https://github.com/feathersjs/feathers/commit/8ce807a5ca53ff5b8d5107a0656c6329404e6e6c)) - -## [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/authentication-oauth - -## [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/authentication-oauth - -## [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/authentication-oauth - -## [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/authentication-oauth - -## [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/authentication-oauth - -## [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/authentication-oauth - -## [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/authentication-oauth - -## [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/authentication-oauth - -## [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/authentication-oauth - -## [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/authentication-oauth - -## [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/authentication-oauth - -## [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/authentication-oauth - -## [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) - -### Bug Fixes - -- **authentication-oauth:** Move Grant error handling to the correct spot ([#3297](https://github.com/feathersjs/feathers/issues/3297)) ([e9c0828](https://github.com/feathersjs/feathers/commit/e9c0828937453c3f0a1bd16010089b825185eab6)) - -## [5.0.9](https://github.com/feathersjs/feathers/compare/v5.0.8...v5.0.9) (2023-09-27) - -### Bug Fixes - -- **authentication-oauth:** Properly handle all oAuth errors ([#3284](https://github.com/feathersjs/feathers/issues/3284)) ([148a9a3](https://github.com/feathersjs/feathers/commit/148a9a319b8e29138fda82d6c03bb489a7b4a6e1)) - -## [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/authentication-oauth - -## [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/authentication-oauth - -## [5.0.6](https://github.com/feathersjs/feathers/compare/v5.0.5...v5.0.6) (2023-06-15) - -### Bug Fixes - -- **authentication-oauth:** Update OAuth redirect to handle user requested redirect paths ([#3186](https://github.com/feathersjs/feathers/issues/3186)) ([3742028](https://github.com/feathersjs/feathers/commit/37420283c17bb8129c6ffdde841ce2034109cc6b)) - -## [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/authentication-oauth - -## [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/authentication-oauth - -# [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/authentication-oauth - -# [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/authentication-oauth - -# [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/authentication-oauth - -# [5.0.0-pre.36](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.35...v5.0.0-pre.36) (2023-01-29) - -### Bug Fixes - -- **authentication-oauth:** Use original headers in oauth flow ([#3025](https://github.com/feathersjs/feathers/issues/3025)) ([fb3d8cc](https://github.com/feathersjs/feathers/commit/fb3d8cca123d68a77b096bc92e49baa55424afe0)) -- Update all dependencies ([#3024](https://github.com/feathersjs/feathers/issues/3024)) ([283dc47](https://github.com/feathersjs/feathers/commit/283dc4798d85584bc031e6e54b83b4ea77d1edd0)) - -# [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) - -### Bug Fixes - -- **core:** Improve service option usage and method option typings ([#2902](https://github.com/feathersjs/feathers/issues/2902)) ([164d75c](https://github.com/feathersjs/feathers/commit/164d75c0f11139a316baa91f1762de8f8eb7da2d)) - -# [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/authentication-oauth - -# [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/authentication-oauth - -# [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 @feathersjs/authentication-oauth - -# [5.0.0-pre.30](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.29...v5.0.0-pre.30) (2022-10-07) - -### Bug Fixes - -- **authentication-oauth:** Fix regression with prefix handling in OAuth ([#2773](https://github.com/feathersjs/feathers/issues/2773)) ([b1844b1](https://github.com/feathersjs/feathers/commit/b1844b1f27feeb7e66920ec9e318872857711834)) - -### 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) - -### Bug Fixes - -- **authentication-oauth:** Fix oAuth origin and error handling ([#2752](https://github.com/feathersjs/feathers/issues/2752)) ([f7e1c33](https://github.com/feathersjs/feathers/commit/f7e1c33de1b7af0672a302d2ba6e15d997f0aa83)) - -### Features - -- Add CORS support to oAuth, Express, Koa and generated application ([#2744](https://github.com/feathersjs/feathers/issues/2744)) ([fd218f2](https://github.com/feathersjs/feathers/commit/fd218f289f8ca4c101e9938e8683e2efef6e8131)) -- **authentication-oauth:** Koa and transport independent oAuth authentication ([#2737](https://github.com/feathersjs/feathers/issues/2737)) ([9231525](https://github.com/feathersjs/feathers/commit/9231525a24bb790ba9c5d940f2867a9c727691c9)) - -# [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/authentication-oauth - -# [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/authentication-oauth - -# [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/authentication-oauth - -# [5.0.0-pre.24](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.23...v5.0.0-pre.24) (2022-06-21) - -### Bug Fixes - -- **authentication-oauth:** Fix bug and properly set Grant defaults ([#2659](https://github.com/feathersjs/feathers/issues/2659)) ([cb93bb9](https://github.com/feathersjs/feathers/commit/cb93bb911fd92282424da2db805cd685b7e4a45b)) - -### Features - -- **cli:** Add typed client to a generated app ([#2669](https://github.com/feathersjs/feathers/issues/2669)) ([5b801b5](https://github.com/feathersjs/feathers/commit/5b801b5017ddc3eaa95622b539f51d605916bc86)) - -# [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/authentication-oauth - -# [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/authentication-oauth - -# [5.0.0-pre.21](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.20...v5.0.0-pre.21) (2022-05-23) - -### Bug Fixes - -- **authentication-oauth:** Fix regression using incorrect callback and redirect_uri ([#2631](https://github.com/feathersjs/feathers/issues/2631)) ([43d8a08](https://github.com/feathersjs/feathers/commit/43d8a082d7e1807f8a431c44a1dbd9b04c3af0d2)) - -# [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 - -- **authentication-oauth:** Don't send origins in Grant's config, as it will be considered another provider ([#2617](https://github.com/feathersjs/feathers/issues/2617)) ([ae3dddd](https://github.com/feathersjs/feathers/commit/ae3dddd8a654924465512d56b4651413912c6932)) -- **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) - -### Bug Fixes - -- **authentication-oauth:** Fix issue with overriding the default Grant configuration ([#2615](https://github.com/feathersjs/feathers/issues/2615)) ([b345857](https://github.com/feathersjs/feathers/commit/b3458578532f9750de2940aeb8afdc75cb0b46f2)) -- **authentication-oauth:** Make oAuth authentication work with cookie-session ([#2614](https://github.com/feathersjs/feathers/issues/2614)) ([9f10bfc](https://github.com/feathersjs/feathers/commit/9f10bfc75083d5bcabea77cfb385aa3965cdf6d6)) - -### Features - -- **typescript:** Improve params and query typeability ([#2600](https://github.com/feathersjs/feathers/issues/2600)) ([df28b76](https://github.com/feathersjs/feathers/commit/df28b7619161f1df5e700326f52cca1a92dc5d28)) - -# [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/authentication-oauth - -# [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/authentication-oauth - -# [5.0.0-pre.16](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.15...v5.0.0-pre.16) (2022-01-12) - -### Bug Fixes - -- **authentication-oauth:** OAuth redirect lost sometimes due to session store race ([#2514](https://github.com/feathersjs/feathers/issues/2514)) ([#2515](https://github.com/feathersjs/feathers/issues/2515)) ([6109c44](https://github.com/feathersjs/feathers/commit/6109c44428c6b8f6bb4e089be760ea1a4ef3d01e)) - -# [5.0.0-pre.15](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.14...v5.0.0-pre.15) (2021-11-27) - -### Features - -- **authentication-oauth:** Allow dynamic oAuth redirect ([#2469](https://github.com/feathersjs/feathers/issues/2469)) ([b7143d4](https://github.com/feathersjs/feathers/commit/b7143d4c0fbe961e714f79512be04449b9bbd7d9)) - -# [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/authentication-oauth - -# [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/authentication-oauth - -# [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/authentication-oauth - -# [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/authentication-oauth - -# [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/authentication-oauth - -# [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/authentication-oauth - -# [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/authentication-oauth - -# [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/authentication-oauth - -# [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/authentication-oauth - -# [5.0.0-pre.5](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.4...v5.0.0-pre.5) (2021-06-23) - -### Bug Fixes - -- **authentication-oauth:** Omit query from internal calls ([#2398](https://github.com/feathersjs/feathers/issues/2398)) ([04c7c83](https://github.com/feathersjs/feathers/commit/04c7c83eeaa6a7466c84b958071b468ed42f0b0f)) -- **koa:** Use extended query parser for compatibility ([#2397](https://github.com/feathersjs/feathers/issues/2397)) ([b2944ba](https://github.com/feathersjs/feathers/commit/b2944bac3ec6d5ecc80dc518cd4e58093692db74)) - -### Features - -- **adapter-commons:** Add support for params.adapter option and move memory adapter to @feathersjs/memory ([#2367](https://github.com/feathersjs/feathers/issues/2367)) ([a43e7da](https://github.com/feathersjs/feathers/commit/a43e7da22b6b981a96d1321736ea9a0cb924fb4f)) - -# [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/authentication-oauth - -# [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)) - -### Features - -- **dependencies:** Remove direct debug dependency ([#2296](https://github.com/feathersjs/feathers/issues/2296)) ([501d416](https://github.com/feathersjs/feathers/commit/501d4164d30c6a126906dc640cdfdc82207ba34a)) - -# [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/authentication-oauth - -# [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/authentication-oauth - -# [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)) - -### Features - -- Feathers v5 core refactoring and features ([#2255](https://github.com/feathersjs/feathers/issues/2255)) ([2dafb7c](https://github.com/feathersjs/feathers/commit/2dafb7ce14ba57406aeec13d10ca45b1e709bee9)) - -# [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) - -**Note:** Version bump only for package @feathersjs/authentication-oauth - -# [5.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v4.5.4...v5.0.0-pre.0) (2020-05-19) - -**Note:** Version bump only for package @feathersjs/authentication-oauth - -## [4.5.9](https://github.com/feathersjs/feathers/compare/v4.5.8...v4.5.9) (2020-10-09) - -### Bug Fixes - -- **authentication-oauth:** Always end session after oAuth flows are finished ([#2087](https://github.com/feathersjs/feathers/issues/2087)) ([d219d0d](https://github.com/feathersjs/feathers/commit/d219d0d89c5e45aa289dd67cb0c8bdc05044c846)) - -## [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/authentication-oauth - -## [4.5.7](https://github.com/feathersjs/feathers/compare/v4.5.6...v4.5.7) (2020-07-24) - -### Bug Fixes - -- **typescript:** Revert add overload types for `find` service methods ([#1972](https://github.com/feathersjs/feathers/issues/1972))" ([#2025](https://github.com/feathersjs/feathers/issues/2025)) ([a9501ac](https://github.com/feathersjs/feathers/commit/a9501acb4d3ef58dfb87d62c57a9bf76569da281)) - -## [4.5.6](https://github.com/feathersjs/feathers/compare/v4.5.5...v4.5.6) (2020-07-12) - -**Note:** Version bump only for package @feathersjs/authentication-oauth - -## [4.5.5](https://github.com/feathersjs/feathers/compare/v4.5.4...v4.5.5) (2020-07-11) - -### Bug Fixes - -- **authentication-oauth:** Updated typings for projects with strictNullChecks ([#1941](https://github.com/feathersjs/feathers/issues/1941)) ([be91206](https://github.com/feathersjs/feathers/commit/be91206e3dba1e65a81412b7aa636bece3ab4aa2)) -- **typescript:** add overload types for `find` service methods ([#1972](https://github.com/feathersjs/feathers/issues/1972)) ([ef55af0](https://github.com/feathersjs/feathers/commit/ef55af088d05d9d36aba9d9f8d6c2c908a4f20dd)) - -## [4.5.4](https://github.com/feathersjs/feathers/compare/v4.5.3...v4.5.4) (2020-04-29) - -### Bug Fixes - -- **authentication-oauth:** Add getEntity method to oAuth authentication and remove provider field for other calls ([#1935](https://github.com/feathersjs/feathers/issues/1935)) ([d925c1b](https://github.com/feathersjs/feathers/commit/d925c1bd193b5c19cb23a246f04fc46d0429fc75)) - -## [4.5.3](https://github.com/feathersjs/feathers/compare/v4.5.2...v4.5.3) (2020-04-17) - -### Bug Fixes - -- **authentication-oauth:** Allow req.feathers to be used in oAuth authentication requests ([#1886](https://github.com/feathersjs/feathers/issues/1886)) ([854c9ca](https://github.com/feathersjs/feathers/commit/854c9cac9a9a5f8f89054a90feb24ab5c4766f5f)) - -## [4.5.2](https://github.com/feathersjs/feathers/compare/v4.5.1...v4.5.2) (2020-03-04) - -### Bug Fixes - -- **package:** update grant-profile to version 0.0.11 ([#1841](https://github.com/feathersjs/feathers/issues/1841)) ([5dcd2aa](https://github.com/feathersjs/feathers/commit/5dcd2aa3483059cc7a2546b145dd72b4705fe2fe)) - -## [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/authentication-oauth - -# [4.5.0](https://github.com/feathersjs/feathers/compare/v4.4.3...v4.5.0) (2020-01-18) - -### Features - -- **authentication-oauth:** Set oAuth redirect URL dynamically and pass query the service ([#1737](https://github.com/feathersjs/feathers/issues/1737)) ([0b05f0b](https://github.com/feathersjs/feathers/commit/0b05f0b58a257820fa61d695a36f36455209f6a1)) - -## [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/authentication-oauth - -## [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/authentication-oauth - -# [4.4.0](https://github.com/feathersjs/feathers/compare/v4.3.11...v4.4.0) (2019-11-27) - -### Features - -- **authentication-oauth:** Set oAuth redirect URL dynamically ([#1608](https://github.com/feathersjs/feathers/issues/1608)) ([1293e08](https://github.com/feathersjs/feathers/commit/1293e088abbb3d23f4a44680836645a8049ceaae)) - -## [4.3.11](https://github.com/feathersjs/feathers/compare/v4.3.10...v4.3.11) (2019-11-11) - -### Bug Fixes - -- **authentication-oauth:** Allow hash based redirects ([#1676](https://github.com/feathersjs/feathers/issues/1676)) ([ffe7cf3](https://github.com/feathersjs/feathers/commit/ffe7cf3fbb4e62d7689065cf7b61f25f602ce8cf)) - -## [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/authentication-oauth - -## [4.3.9](https://github.com/feathersjs/feathers/compare/v4.3.8...v4.3.9) (2019-10-26) - -### Bug Fixes - -- Only initialize default Express session if oAuth is actually used ([#1648](https://github.com/feathersjs/feathers/issues/1648)) ([9b9b43f](https://github.com/feathersjs/feathers/commit/9b9b43ff09af1080e4aaa537064bac37b881c9a2)) - -## [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/authentication-oauth - -## [4.3.5](https://github.com/feathersjs/feathers/compare/v4.3.4...v4.3.5) (2019-10-07) - -**Note:** Version bump only for package @feathersjs/authentication-oauth - -## [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/authentication-oauth - -## [4.3.3](https://github.com/feathersjs/feathers/compare/v4.3.2...v4.3.3) (2019-09-21) - -### Bug Fixes - -- Small improvements in dependencies and code sturcture ([#1562](https://github.com/feathersjs/feathers/issues/1562)) ([42c13e2](https://github.com/feathersjs/feathers/commit/42c13e2)) - -## [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/authentication-oauth - -## [4.3.1](https://github.com/feathersjs/feathers/compare/v4.3.0...v4.3.1) (2019-09-09) - -### Bug Fixes - -- Omit standard protocol ports from the default hostname ([#1543](https://github.com/feathersjs/feathers/issues/1543)) ([ef16d29](https://github.com/feathersjs/feathers/commit/ef16d29)) - -# [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/authentication-oauth - -# [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/authentication-oauth - -# [4.3.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.2...v4.3.0-pre.3) (2019-08-19) - -### Bug Fixes - -- Update all dependencies ([7d53a00](https://github.com/feathersjs/feathers/commit/7d53a00)) -- Use WeakMap to connect socket to connection ([#1509](https://github.com/feathersjs/feathers/issues/1509)) ([64807e3](https://github.com/feathersjs/feathers/commit/64807e3)) - -# [4.3.0-pre.2](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.1...v4.3.0-pre.2) (2019-08-02) - -### Bug Fixes - -- Add method to reliably get default authentication service ([#1470](https://github.com/feathersjs/feathers/issues/1470)) ([e542cb3](https://github.com/feathersjs/feathers/commit/e542cb3)) - -# [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/authentication-oauth - -# [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/authentication-oauth - -# [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/authentication-oauth - -# [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 - -- Make oAuth paths more consistent and improve authentication client ([#1377](https://github.com/feathersjs/feathers/issues/1377)) ([adb2543](https://github.com/feathersjs/feathers/commit/adb2543)) -- 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 - -- Correctly read the oauth strategy config ([#1349](https://github.com/feathersjs/feathers/issues/1349)) ([9abf314](https://github.com/feathersjs/feathers/commit/9abf314)) - -### Features - -- Add global disconnect event ([#1355](https://github.com/feathersjs/feathers/issues/1355)) ([85afcca](https://github.com/feathersjs/feathers/commit/85afcca)) - -# [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 - -- Always require strategy parameter in authentication ([#1327](https://github.com/feathersjs/feathers/issues/1327)) ([d4a8021](https://github.com/feathersjs/feathers/commit/d4a8021)) -- Improve authentication parameter handling ([#1333](https://github.com/feathersjs/feathers/issues/1333)) ([6e77204](https://github.com/feathersjs/feathers/commit/6e77204)) -- Improve oAuth option handling and usability ([#1335](https://github.com/feathersjs/feathers/issues/1335)) ([adb137d](https://github.com/feathersjs/feathers/commit/adb137d)) -- Merge httpStrategies and authStrategies option ([#1308](https://github.com/feathersjs/feathers/issues/1308)) ([afa4d55](https://github.com/feathersjs/feathers/commit/afa4d55)) -- Rename jwtStrategies option to authStrategies ([#1305](https://github.com/feathersjs/feathers/issues/1305)) ([4aee151](https://github.com/feathersjs/feathers/commit/4aee151)) - -### Features - -- Change and *JWT methods to *accessToken ([#1304](https://github.com/feathersjs/feathers/issues/1304)) ([5ac826b](https://github.com/feathersjs/feathers/commit/5ac826b)) - -# [4.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v3.2.0-pre.1...v4.0.0-pre.0) (2019-04-21) - -### Features - -- @feathersjs/authentication-oauth ([#1299](https://github.com/feathersjs/feathers/issues/1299)) ([656bae7](https://github.com/feathersjs/feathers/commit/656bae7)) diff --git a/packages/authentication-oauth/LICENSE b/packages/authentication-oauth/LICENSE deleted file mode 100644 index 7839c824d7..0000000000 --- a/packages/authentication-oauth/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2024 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 -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -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-oauth/README.md b/packages/authentication-oauth/README.md deleted file mode 100644 index 797a932308..0000000000 --- a/packages/authentication-oauth/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# @feathersjs/authentication-oauth - -[![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/authentication-oauth.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/authentication-oauth) -[![Discord](https://badgen.net/badge/icon/discord?icon=discord&label)](https://discord.gg/qa8kez8QBx) - -> OAuth 1 and 2 authentication for Feathers. Powered by Grant. - -## Installation - -``` -npm install @feathersjs/authentication-oauth --save -``` - -## Documentation - -Refer to the [Feathers oAuth authentication API documentation](https://feathersjs.com/api/authentication/oauth.html) 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/authentication-oauth/package.json b/packages/authentication-oauth/package.json deleted file mode 100644 index 9406d3cfaf..0000000000 --- a/packages/authentication-oauth/package.json +++ /dev/null @@ -1,85 +0,0 @@ -{ - "name": "@feathersjs/authentication-oauth", - "description": "oAuth 1 and 2 authentication for Feathers. Powered by Grant.", - "version": "5.0.34", - "homepage": "https://feathersjs.com", - "main": "lib/", - "types": "lib/", - "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", - "directory": "packages/authentication-oauth" - }, - "author": { - "name": "Feathers contributors", - "email": "hello@feathersjs.com", - "url": "https://feathersjs.com" - }, - "contributors": [], - "bugs": { - "url": "https://github.com/feathersjs/feathers/issues" - }, - "engines": { - "node": ">= 12" - }, - "files": [ - "CHANGELOG.md", - "LICENSE", - "README.md", - "src/**", - "lib/**", - "*.d.ts", - "*.js" - ], - "scripts": { - "start": "ts-node test/app", - "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" - }, - "directories": { - "lib": "lib" - }, - "publishConfig": { - "access": "public" - }, - "dependencies": { - "@feathersjs/authentication": "^5.0.34", - "@feathersjs/commons": "^5.0.34", - "@feathersjs/errors": "^5.0.34", - "@feathersjs/express": "^5.0.34", - "@feathersjs/feathers": "^5.0.34", - "@feathersjs/koa": "^5.0.34", - "@feathersjs/schema": "^5.0.34", - "cookie-session": "^2.1.1", - "grant": "^5.4.24", - "koa-session": "^7.0.2", - "qs": "^6.14.0" - }, - "devDependencies": { - "@feathersjs/memory": "^5.0.34", - "@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.1.0", - "@types/tough-cookie": "^4.0.5", - "axios": "^1.11.0", - "mocha": "^11.7.1", - "shx": "^0.4.0", - "tough-cookie": "^5.1.2", - "ts-node": "^10.9.2", - "typescript": "^5.9.2" - }, - "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" -} diff --git a/packages/authentication-oauth/src/index.ts b/packages/authentication-oauth/src/index.ts deleted file mode 100644 index 9d25b6f6c1..0000000000 --- a/packages/authentication-oauth/src/index.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { 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' - -const debug = createDebug('@feathersjs/authentication-oauth') - -export { OauthSetupSettings, OAuthStrategy, OAuthProfile, OAuthService } - -export const oauth = - (settings: Partial = {}) => - (app: Application) => { - const authService = app.defaultAuthentication ? app.defaultAuthentication(settings.authService) : null - - if (!authService) { - throw new Error( - 'An authentication service must exist before registering @feathersjs/authentication-oauth' - ) - } - - if (!authService.configuration.oauth) { - debug('No oauth configuration found in authentication configuration. Skipping oAuth setup.') - return - } - - const oauthOptions = { - linkStrategy: 'jwt', - ...settings - } - - const grantConfig = getGrantConfig(authService) - const serviceOptions = authenticationServiceOptions(authService, oauthOptions) - const servicePath = `${grantConfig.defaults.prefix || 'oauth'}/:provider` - const callbackServicePath = `${servicePath}/callback` - const oauthService = new OAuthService(authService, oauthOptions) - - app.use(servicePath, oauthService, serviceOptions) - app.use(callbackServicePath, new OAuthCallbackService(oauthService), serviceOptions) - app.service(servicePath).hooks({ - around: { all: [resolveDispatch(), redirectHook()] } - }) - app.service(callbackServicePath).hooks({ - around: { all: [resolveDispatch(), redirectHook()] } - }) - - if (typeof app.service(servicePath).publish === 'function') { - app.service(servicePath).publish(() => null) - } - - if (typeof app.service(callbackServicePath).publish === 'function') { - app.service(callbackServicePath).publish(() => null) - } - } diff --git a/packages/authentication-oauth/src/service.ts b/packages/authentication-oauth/src/service.ts deleted file mode 100644 index 1ae575d6aa..0000000000 --- a/packages/authentication-oauth/src/service.ts +++ /dev/null @@ -1,203 +0,0 @@ -import { createDebug } from '@feathersjs/commons' -import { 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 { AuthenticationService } from '@feathersjs/authentication' -import { OAuthStrategy } from './strategy' -import { getGrantConfig, OauthSetupSettings } from './utils' - -const debug = createDebug('@feathersjs/authentication-oauth/services') - -export type GrantResponse = { - location: string - session: any - state: any -} - -export type OAuthParams = Omit & { - session: any - state: Record - route: { - provider: string - } -} - -export class OAuthError extends FeathersError { - constructor( - message: string, - data: any, - public location: string - ) { - super(message, 'NotAuthenticated', 401, 'not-authenticated', data) - } -} - -export const redirectHook = () => async (context: HookContext, next: NextFunction) => { - try { - await next() - - const { location } = context.result - - debug(`oAuth redirect to ${location}`) - - if (location) { - context.http = { - ...context.http, - location - } - } - } catch (error: any) { - if (error.location) { - context.http = { - ...context.http, - location: error.location - } - context.result = typeof error.toJSON === 'function' ? error.toJSON() : error - } else { - throw error - } - } -} - -export class OAuthService { - grant: any - - constructor( - public service: AuthenticationService, - public settings: OauthSetupSettings - ) { - const config = getGrantConfig(service) - - this.grant = Grant({ config }) - } - - async handler(method: string, params: OAuthParams, body?: any, override?: string): Promise { - const { - session, - state, - query, - route: { provider } - } = params - - const result: GrantResponse = await this.grant({ - params: { provider, override }, - state: state.grant, - session: session.grant, - query, - method, - body - }) - - session.grant = result.session - state.grant = result.state - - return result - } - - async authenticate(params: OAuthParams, result: GrantResponse) { - const name = params.route.provider - const { linkStrategy, authService } = this.settings - const { accessToken, grant, headers, query = {}, redirect } = params.session - const strategy = this.service.getStrategy(name) as OAuthStrategy - const authParams = { - ...params, - headers, - authStrategies: [name], - authentication: accessToken - ? { - strategy: linkStrategy, - accessToken - } - : null, - query, - redirect - } - - const payload = grant?.response || result?.session?.response || result?.state?.response || params.query - const authentication = { - strategy: name, - ...payload - } - - try { - if (payload.error) { - throw new GeneralError(payload.error_description || payload.error, payload) - } - - debug(`Calling ${authService}.create authentication with strategy ${name}`) - - const authResult = await this.service.create(authentication, authParams) - - debug('Successful oAuth authentication, sending response') - - const location = await strategy.getRedirect(authResult, authParams) - - if (typeof params.session.destroy === 'function') { - await params.session.destroy() - } - - return { - ...authResult, - location - } - } catch (error: any) { - const location = await strategy.getRedirect(error, authParams) - const e = new OAuthError(error.message, error.data, location) - - if (typeof params.session.destroy === 'function') { - await params.session.destroy() - } - - e.stack = error.stack - throw e - } - } - - async find(params: OAuthParams) { - const { session, query, headers } = params - const { feathers_token, redirect, ...restQuery } = query - const handlerParams = { - ...params, - query: restQuery - } - - if (feathers_token) { - debug('Got feathers_token query parameter to link accounts', feathers_token) - session.accessToken = feathers_token - } - - session.redirect = redirect - session.query = restQuery - session.headers = headers - - return this.handler('GET', handlerParams, {}) - } - - async get(override: string, params: OAuthParams) { - const result = await this.handler('GET', params, {}, override) - - return result - } - - async create(data: any, params: OAuthParams) { - return this.handler('POST', params, data) - } -} - -export class OAuthCallbackService { - constructor(public service: OAuthService) {} - - async find(params: OAuthParams) { - const result = await this.service.handler('GET', params, {}, 'callback') - - return this.service.authenticate(params, result) - } - - async create(data: any, params: OAuthParams) { - const result = await this.service.handler('POST', params, data, 'callback') - - return this.service.authenticate(params, result) - } -} diff --git a/packages/authentication-oauth/src/strategy.ts b/packages/authentication-oauth/src/strategy.ts deleted file mode 100644 index 4bfe2589fc..0000000000 --- a/packages/authentication-oauth/src/strategy.ts +++ /dev/null @@ -1,176 +0,0 @@ -import { - AuthenticationRequest, - AuthenticationBaseStrategy, - AuthenticationResult, - AuthenticationParams -} from '@feathersjs/authentication' -import { Params } from '@feathersjs/feathers' -import { NotAuthenticated } from '@feathersjs/errors' -import { createDebug, _ } from '@feathersjs/commons' -import qs from 'qs' - -const debug = createDebug('@feathersjs/authentication-oauth/strategy') - -export interface OAuthProfile { - id?: string | number - [key: string]: any -} - -export class OAuthStrategy extends AuthenticationBaseStrategy { - get configuration() { - const { entity, service, entityId, oauth } = this.authentication.configuration - const config = oauth[this.name] as any - - return { - entity, - service, - entityId, - ...config - } - } - - get entityId(): string { - const { entityService } = this - - return this.configuration.entityId || (entityService && (entityService as any).id) - } - - async getEntityQuery(profile: OAuthProfile, _params: Params) { - return { - [`${this.name}Id`]: profile.sub || profile.id - } - } - - async getEntityData(profile: OAuthProfile, _existingEntity: any, _params: Params) { - return { - [`${this.name}Id`]: profile.sub || profile.id - } - } - - async getProfile(data: AuthenticationRequest, _params: Params) { - return data.profile - } - - async getCurrentEntity(params: Params) { - const { authentication } = params - const { entity } = this.configuration - - if (authentication && authentication.strategy) { - debug('getCurrentEntity with authentication', authentication) - - const { strategy } = authentication - const authResult = await this.authentication.authenticate(authentication, params, strategy) - - return authResult[entity] - } - - return null - } - - async getAllowedOrigin(params?: Params) { - const { redirect, origins = this.app.get('origins') } = this.authentication.configuration.oauth - - if (Array.isArray(origins)) { - const referer = params?.headers?.referer || origins[0] - const allowedOrigin = origins.find((current) => referer.toLowerCase().startsWith(current.toLowerCase())) - - if (!allowedOrigin) { - throw new NotAuthenticated(`Referer "${referer}" is not allowed.`) - } - - return allowedOrigin - } - - return redirect - } - - async getRedirect( - data: AuthenticationResult | Error, - params?: AuthenticationParams - ): Promise { - const queryRedirect = (params && params.redirect) || '' - const redirect = await this.getAllowedOrigin(params) - - if (!redirect) { - return null - } - - const redirectUrl = `${redirect}${queryRedirect}` - const separator = redirectUrl.endsWith('?') ? '' : redirect.indexOf('#') !== -1 ? '?' : '#' - const authResult: AuthenticationResult = data - const query = authResult.accessToken - ? { access_token: authResult.accessToken } - : { error: data.message || 'OAuth Authentication not successful' } - - return `${redirectUrl}${separator}${qs.stringify(query)}` - } - - async findEntity(profile: OAuthProfile, params: Params) { - const query = await this.getEntityQuery(profile, params) - - debug('findEntity with query', query) - - const result = await this.entityService.find({ - ...params, - query - }) - const [entity = null] = result.data ? result.data : result - - debug('findEntity returning', entity) - - return entity - } - - async createEntity(profile: OAuthProfile, params: Params) { - const data = await this.getEntityData(profile, null, params) - - debug('createEntity with data', data) - - return this.entityService.create(data, _.omit(params, 'query')) - } - - async updateEntity(entity: any, profile: OAuthProfile, params: Params) { - const id = entity[this.entityId] - const data = await this.getEntityData(profile, entity, params) - - debug(`updateEntity with id ${id} and data`, data) - - return this.entityService.patch(id, data, _.omit(params, 'query')) - } - - async getEntity(result: any, params: Params) { - const { entityService } = this - const { entityId = (entityService as any).id, entity } = this.configuration - - if (!entityId || result[entityId] === undefined) { - throw new NotAuthenticated('Could not get oAuth entity') - } - - if (!params.provider) { - return result - } - - return entityService.get(result[entityId], { - ..._.omit(params, 'query'), - [entity]: result - }) - } - - async authenticate(authentication: AuthenticationRequest, originalParams: AuthenticationParams) { - const entity: string = this.configuration.entity - const { provider, ...params } = originalParams - const profile = await this.getProfile(authentication, params) - const existingEntity = (await this.findEntity(profile, params)) || (await this.getCurrentEntity(params)) - - debug('authenticate with (existing) entity', existingEntity) - - const authEntity = !existingEntity - ? await this.createEntity(profile, params) - : await this.updateEntity(existingEntity, profile, params) - - return { - authentication: { strategy: this.name }, - [entity]: await this.getEntity(authEntity, originalParams) - } - } -} diff --git a/packages/authentication-oauth/src/utils.ts b/packages/authentication-oauth/src/utils.ts deleted file mode 100644 index 21eff4217f..0000000000 --- a/packages/authentication-oauth/src/utils.ts +++ /dev/null @@ -1,127 +0,0 @@ -import type { RequestHandler } from 'express' -import type { Middleware, Application as KoaApplication } from '@feathersjs/koa' - -import type { ServiceOptions } from '@feathersjs/feathers' - -import '@feathersjs/koa' -import '@feathersjs/express' -import expressCookieSession from 'cookie-session' -import koaCookieSession from 'koa-session' - -import { AuthenticationService } from '@feathersjs/authentication' -import { GrantConfig } from 'grant' - -export interface OauthSetupSettings { - linkStrategy: string - authService?: string - expressSession?: RequestHandler - koaSession?: Middleware -} - -export const getGrantConfig = (service: AuthenticationService): GrantConfig => { - const { - app, - configuration: { oauth } - } = service - // Set up all the defaults - const port = app.get('port') - let host = app.get('host') - let protocol = 'https' - - // Development environments commonly run on HTTP with an extended port - if (process.env.NODE_ENV !== 'production') { - protocol = 'http' - if (String(port) !== '80') { - host += `:${port}` - } - } - - // omit 'redirect' and 'origins' from oauth - const { redirect, origins, ...oauthConfig } = oauth - - const grant: GrantConfig = { - ...oauthConfig, - defaults: { - prefix: '/oauth', - origin: `${protocol}://${host}`, - transport: 'state', - response: ['tokens', 'raw', 'profile'], - ...oauthConfig.defaults - } - } - - const getUrl = (url: string) => { - const { defaults } = grant - return `${defaults.origin}${defaults.prefix}/${url}` - } - - // iterate over grant object with key and value - for (const [name, value] of Object.entries(grant)) { - if (name !== 'defaults') { - value.redirect_uri = value.redirect_uri || getUrl(`${name}/callback`) - } - } - - return grant -} - -export const setExpressParams: RequestHandler = (req, res, next) => { - req.session.destroy ||= () => { - req.session = null - } - - req.feathers = { - ...req.feathers, - session: req.session, - state: res.locals - } - - next() -} - -export const setKoaParams: Middleware = async (ctx, next) => { - ctx.session.destroy ||= () => { - ctx.session = null - } - - ctx.feathers = { - ...ctx.feathers, - session: ctx.session, - state: ctx.state - } as any - - await next() -} - -export const authenticationServiceOptions = ( - service: AuthenticationService, - settings: OauthSetupSettings -): ServiceOptions => { - const { secret } = service.configuration - const koaApp = service.app as KoaApplication - - if (koaApp.context) { - koaApp.keys = [secret] - - const { koaSession = koaCookieSession({ key: 'feathers.oauth' }, koaApp as any) } = settings - - return { - koa: { - before: [koaSession, setKoaParams] - } - } - } - - const { - expressSession = expressCookieSession({ - name: 'feathers.oauth', - keys: [secret] - }) - } = settings - - return { - express: { - before: [expressSession, setExpressParams] - } - } -} diff --git a/packages/authentication-oauth/test/index.test.ts b/packages/authentication-oauth/test/index.test.ts deleted file mode 100644 index f4e192482e..0000000000 --- a/packages/authentication-oauth/test/index.test.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { strict as assert } from 'assert' -import { feathers } from '@feathersjs/feathers' -import { oauth, OauthSetupSettings } from '../src' -import { AuthenticationService } from '@feathersjs/authentication' - -describe('@feathersjs/authentication-oauth', () => { - describe('setup', () => { - it('errors when service does not exist', () => { - const app = feathers() - - assert.throws( - () => { - app.configure(oauth({ authService: 'something' } as OauthSetupSettings)) - }, - { - message: 'An authentication service must exist before registering @feathersjs/authentication-oauth' - } - ) - }) - - it('does not error when service is configured', () => { - const app = feathers() - - app.use('/authentication', new AuthenticationService(app)) - - app.configure(oauth()) - }) - }) -}) diff --git a/packages/authentication-oauth/test/service.test.ts b/packages/authentication-oauth/test/service.test.ts deleted file mode 100644 index a39310763a..0000000000 --- a/packages/authentication-oauth/test/service.test.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { strict as assert } from 'assert' -import axios, { AxiosResponse } from 'axios' -import { CookieJar } from 'tough-cookie' -import { expressFixture } from './utils/fixture' - -describe('@feathersjs/authentication-oauth service', () => { - const port = 9778 - const req = axios.create({ - withCredentials: true, - maxRedirects: 0 - }) - const cookie = new CookieJar() - let app: Awaited> - - const fetchErrorResponse = async (url: string): Promise => { - try { - await req.get(url) - } catch (error: any) { - return error.response - } - assert.fail('Should never get here') - } - - before(async () => { - app = await expressFixture(port, 5115) - }) - - after(async () => { - await app.teardown() - }) - - it('runs through the oAuth flow', async () => { - const host = `http://localhost:${port}` - let location = `${host}/oauth/github` - - const oauthResponse = await fetchErrorResponse(location) - assert.equal(oauthResponse.status, 303) - - oauthResponse.headers['set-cookie']?.forEach((value) => cookie.setCookie(value, host)) - - location = oauthResponse.data.location - - const providerResponse = await fetchErrorResponse(location) - assert.equal(providerResponse.status, 302) - - location = providerResponse.headers.location - - const { data } = await req.get(location, { - headers: { - cookie: await cookie.getCookieString(host) - } - }) - - assert.ok(data.accessToken) - assert.equal(data.authentication.strategy, 'github') - }) -}) diff --git a/packages/authentication-oauth/test/strategy.test.ts b/packages/authentication-oauth/test/strategy.test.ts deleted file mode 100644 index a4386fcbc2..0000000000 --- a/packages/authentication-oauth/test/strategy.test.ts +++ /dev/null @@ -1,200 +0,0 @@ -import { strict as assert } from 'assert' -import { expressFixture, TestOAuthStrategy } from './utils/fixture' -import { AuthenticationService } from '@feathersjs/authentication' - -describe('@feathersjs/authentication-oauth/strategy', () => { - let app: Awaited> - let authService: AuthenticationService - let strategy: TestOAuthStrategy - - before(async () => { - app = await expressFixture(9778, 5115) - authService = app.service('authentication') - strategy = authService.getStrategy('github') as TestOAuthStrategy - }) - - after(async () => { - await app.teardown() - }) - - it('initializes, has .entityId and configuration', () => { - assert.ok(strategy) - assert.strictEqual(strategy.entityId, 'id') - assert.ok(strategy.configuration.entity) - }) - - it('reads configuration from the oauth key', () => { - const testConfigValue = Math.random() - app.get('authentication').oauth.github.hello = testConfigValue - assert.strictEqual(strategy.configuration.hello, testConfigValue) - }) - - it('getRedirect', async () => { - app.get('authentication').oauth.redirect = '/home' - - let redirect = await strategy.getRedirect({ accessToken: 'testing' }) - assert.equal(redirect, '/home#access_token=testing') - - redirect = await strategy.getRedirect( - { accessToken: 'testing' }, - { - redirect: '/hi-there' - } - ) - assert.strictEqual('/home/hi-there#access_token=testing', redirect) - - redirect = await strategy.getRedirect( - { accessToken: 'testing' }, - { - redirect: '/hi-there?' - } - ) - assert.equal(redirect, '/home/hi-there?access_token=testing') - - redirect = await strategy.getRedirect(new Error('something went wrong')) - assert.equal(redirect, '/home#error=something%20went%20wrong') - - redirect = await strategy.getRedirect(new Error()) - assert.equal(redirect, '/home#error=OAuth%20Authentication%20not%20successful') - - app.get('authentication').oauth.redirect = '/home?' - - redirect = await strategy.getRedirect({ accessToken: 'testing' }) - assert.equal(redirect, '/home?access_token=testing') - - delete app.get('authentication').oauth.redirect - - redirect = await strategy.getRedirect({ accessToken: 'testing' }) - assert.equal(redirect, null) - - app.get('authentication').oauth.redirect = '/#dashboard' - - redirect = await strategy.getRedirect({ accessToken: 'testing' }) - assert.equal(redirect, '/#dashboard?access_token=testing') - }) - - it('getRedirect with referrer and allowed origins (#2430)', async () => { - app.get('authentication').oauth.origins = ['https://feathersjs.com', 'https://feathers.cloud'] - - let redirect = await strategy.getRedirect( - { accessToken: 'testing' }, - { - headers: { - referer: 'https://feathersjs.com/somewhere' - } - } - ) - assert.equal(redirect, 'https://feathersjs.com#access_token=testing') - - redirect = await strategy.getRedirect({ accessToken: 'testing' }, {}) - assert.equal(redirect, 'https://feathersjs.com#access_token=testing') - - redirect = await strategy.getRedirect( - { accessToken: 'testing' }, - { - headers: { - referer: 'HTTPS://feathers.CLOUD' - } - } - ) - assert.equal(redirect, 'https://feathers.cloud#access_token=testing') - - redirect = await strategy.getRedirect( - { accessToken: 'testing' }, - { - redirect: '/home', - headers: { - referer: 'https://feathersjs.com/somewhere' - } - } - ) - assert.equal(redirect, 'https://feathersjs.com/home#access_token=testing') - - await assert.rejects( - () => - strategy.getRedirect( - { accessToken: 'testing' }, - { - headers: { - referer: 'https://example.com' - } - } - ), - { - message: 'Referer "https://example.com" is not allowed.' - } - ) - }) - - describe('authenticate', () => { - it('with new user', async () => { - const authResult = await strategy.authenticate( - { - strategy: 'test', - profile: { - id: 'newEntity' - } - }, - {} - ) - - assert.deepEqual(authResult, { - authentication: { strategy: 'github' }, - user: { githubId: 'newEntity', id: authResult.user.id } - }) - }) - - it('with existing user and already linked strategy', async () => { - const existingUser = await app.service('users').create({ - githubId: 'existingEntity', - name: 'David' - }) - const authResult = await strategy.authenticate( - { - strategy: 'test', - profile: { - id: 'existingEntity' - } - }, - {} - ) - - assert.deepEqual(authResult, { - authentication: { strategy: 'github' }, - user: existingUser - }) - }) - - it('links user with existing authentication', async () => { - const user = await app.service('users').create({ - name: 'David' - }) - const jwt = await authService.createAccessToken( - {}, - { - subject: `${user.id}` - } - ) - - const authResult = await strategy.authenticate( - { - strategy: 'test', - profile: { - id: 'linkedEntity' - } - }, - { - authentication: { - strategy: 'jwt', - accessToken: jwt - } - } - ) - - assert.deepEqual(authResult, { - authentication: { strategy: 'github' }, - user: { id: user.id, name: user.name, githubId: 'linkedEntity' } - }) - }) - }) -}) diff --git a/packages/authentication-oauth/test/utils.test.ts b/packages/authentication-oauth/test/utils.test.ts deleted file mode 100644 index 76a3bd34e7..0000000000 --- a/packages/authentication-oauth/test/utils.test.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { AuthenticationService } from '@feathersjs/authentication/lib' -import { feathers } from '@feathersjs/feathers/lib' -import { strict as assert } from 'assert' -import { getGrantConfig } from '../src/utils' - -describe('@feathersjs/authentication-oauth/utils', () => { - it('getGrantConfig initialises Grant defaults', () => { - const app = feathers<{ authentication: AuthenticationService }>() - const auth = new AuthenticationService(app) - - app.set('host', '127.0.0.1') - app.set('port', '8877') - app.set('authentication', { - secret: 'supersecret', - entity: 'user', - service: 'users', - authStrategies: ['jwt'], - oauth: { - github: { - key: 'some-key', - secret: 'a secret secret', - authorize_url: '/github/authorize_url', - access_url: '/github/access_url', - dynamic: true - } - } - }) - const { defaults } = getGrantConfig(auth) - - assert.deepStrictEqual(defaults, { - prefix: '/oauth', - origin: 'http://127.0.0.1:8877', - transport: 'state', - response: ['tokens', 'raw', 'profile'] - }) - }) - - it('getGrantConfig uses Grant defaults when set', () => { - const app = feathers<{ authentication: AuthenticationService }>() - const auth = new AuthenticationService(app) - - app.set('host', '127.0.0.1') - app.set('port', '8877') - app.set('authentication', { - secret: 'supersecret', - entity: 'user', - service: 'users', - authStrategies: ['jwt'], - oauth: { - defaults: { - prefix: '/auth', - origin: 'https://localhost:3344' - }, - github: { - key: 'some-key', - secret: 'a secret secret', - authorize_url: '/github/authorize_url', - access_url: '/github/access_url', - dynamic: true - } - } - }) - const { defaults, github } = getGrantConfig(auth) - - assert.deepStrictEqual(defaults, { - prefix: '/auth', - origin: 'https://localhost:3344', - transport: 'state', - response: ['tokens', 'raw', 'profile'] - }) - assert.strictEqual(github?.redirect_uri, 'https://localhost:3344/auth/github/callback') - }) -}) diff --git a/packages/authentication-oauth/test/utils/fixture.ts b/packages/authentication-oauth/test/utils/fixture.ts deleted file mode 100644 index 0371f516ea..0000000000 --- a/packages/authentication-oauth/test/utils/fixture.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { Application, feathers, NextFunction } 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' - -export interface ServiceTypes { - authentication: AuthenticationService - users: MemoryService -} - -export class TestOAuthStrategy extends OAuthStrategy { - async authenticate(data: AuthenticationRequest, params: AuthenticationParams) { - const { fromMiddleware } = params - const authResult = await super.authenticate(data, params) - - if (fromMiddleware) { - authResult.fromMiddleware = fromMiddleware - } - - return authResult - } -} - -export const fixtureConfig = - (port: number, providerInstance: Awaited>) => (app: Application) => { - app.set('host', '127.0.0.1') - app.set('port', port) - app.set('authentication', { - secret: 'supersecret', - entity: 'user', - service: 'users', - authStrategies: ['jwt'], - oauth: { - github: { - key: 'some-key', - secret: 'a secret secret', - authorize_url: providerInstance.url(`/github/authorize_url`), - access_url: providerInstance.url(`/github/access_url`), - dynamic: true - } - } - }) - - return app - } - -export const expressFixture = async (serverPort: number, providerPort: number) => { - const providerInstance = await provider({ flow: 'oauth2', port: providerPort }) - const app = express(feathers()) - const auth = new AuthenticationService(app) - - auth.register('jwt', new JWTStrategy()) - auth.register('github', new TestOAuthStrategy()) - - app.configure(rest()) - app.configure(fixtureConfig(serverPort, providerInstance)) - - app.use((req, _res, next) => { - req.feathers = { fromMiddleware: 'testing' } - next() - }) - app.use('authentication', auth) - app.use('users', memory()) - - app.configure(oauth()) - app.use(errorHandler({ logger: false })) - app.hooks({ - teardown: [ - async (_context: any, next: NextFunction) => { - await providerInstance.close() - await next() - } - ] - }) - app.hooks({ - error: { - all: [ - async (context) => { - console.error(context.error) - } - ] - } - }) - - await app.listen(serverPort) - - return app -} diff --git a/packages/authentication-oauth/test/utils/provider.ts b/packages/authentication-oauth/test/utils/provider.ts deleted file mode 100644 index 7a63e25e87..0000000000 --- a/packages/authentication-oauth/test/utils/provider.ts +++ /dev/null @@ -1,282 +0,0 @@ -/* eslint-disable @typescript-eslint/no-non-null-assertion */ -/* eslint-disable @typescript-eslint/no-empty-function */ -// Ported from https://github.com/simov/grant/blob/master/test/util/provider.js -import http from 'http' -import _url from 'url' -import qs from 'qs' - -const buffer = (req: http.IncomingMessage, done: any) => { - let data = '' - req.on('data', (chunk: any) => (data += chunk)) - req.on('end', () => done(/^{.*}$/.test(data) ? JSON.parse(data) : qs.parse(data))) -} -const _query = (req: http.IncomingMessage) => { - const parsed = _url.parse(req.url as string, false) - const query = qs.parse(parsed.query as any) - return query -} -const _oauth = (req: http.IncomingMessage) => - qs.parse((req.headers.authorization || '').replace('OAuth ', '').replace(/"/g, '').replace(/,/g, '&')) - -const sign = (...args: any[]) => - args - .map((arg, index) => - index < 2 - ? Buffer.from(JSON.stringify(arg)) - .toString('base64') - .replace(/=/g, '') - .replace(/\+/g, '-') - .replace(/\//g, '_') - : arg - ) - .join('.') - -export const provider = async ({ flow, port = 5000 }: { flow: 'oauth2' | 'oauth1'; port: number }) => { - const server = await (flow === 'oauth2' ? oauth2(port) : oauth1(port)) - return { - oauth1, - oauth2, - on, - server, - url: (path: string) => `http://localhost:${port}${path}`, - close: () => new Promise((resolve) => server.close(resolve)) - } -} - -const oauth1 = (port: number) => - new Promise((resolve) => { - let callback: any - const server = http.createServer() - server.on('request', (req, res) => { - const method = req.method - const url = req.url as string - const headers = req.headers - const oauth = _oauth(req) - const query = _query(req) - const provider = /^\/(.*)\/.*/.exec(url) && /^\/(.*)\/.*/.exec(url)![1] - - if (/request_url/.test(url)) { - callback = oauth.oauth_callback - buffer(req, (form: any) => { - if (provider === 'getpocket') { - callback = form.redirect_uri - } - on.request({ url, headers, query, form, oauth }) - provider === 'sellsy' - ? res.writeHead(200, { 'content-type': 'application/json' }) - : res.writeHead(200, { 'content-type': 'application/x-www-form-urlencoded' }) - provider === 'getpocket' - ? res.end(qs.stringify({ code: 'code' })) - : provider === 'sellsy' - ? res.end( - 'authentification_url=https://apifeed.sellsy.com/0/login.php&oauth_token=token&oauth_token_secret=secret&oauth_callback_confirmed=true' - ) - : res.end(qs.stringify({ oauth_token: 'token', oauth_token_secret: 'secret' })) - }) - } else if (/authorize_url/.test(url)) { - const location = callback + '?' + qs.stringify({ oauth_token: 'token', oauth_verifier: 'verifier' }) - on.authorize({ url, headers, query }) - res.writeHead(302, { location }) - res.end() - } else if (/access_url/.test(url)) { - buffer(req, (form: any) => { - on.access({ url, headers, query, form, oauth }) - res.writeHead(200, { 'content-type': 'application/json' }) - provider === 'getpocket' - ? res.end(JSON.stringify({ access_token: 'token' })) - : res.end( - JSON.stringify({ - oauth_token: 'token', - oauth_token_secret: 'secret', - user_id: provider === 'twitter' ? 'id' : undefined - }) - ) - }) - } else if (/request_error_message/.test(url)) { - callback = oauth.oauth_callback - buffer(req, (form: any) => { - on.request({ url, headers, query, form, oauth }) - res.writeHead(200, { 'content-type': 'application/x-www-form-urlencoded' }) - res.end(qs.stringify({ error: { message: 'invalid' } })) - }) - } else if (/request_error_token/.test(url)) { - callback = oauth.oauth_callback - buffer(req, (form: any) => { - on.request({ url, headers, query, form, oauth }) - res.writeHead(200, { 'content-type': 'application/x-www-form-urlencoded' }) - res.end() - }) - } else if (/request_error_status/.test(url)) { - callback = oauth.oauth_callback - buffer(req, (form: any) => { - on.request({ url, headers, query, form, oauth }) - res.writeHead(500, { 'content-type': 'application/x-www-form-urlencoded' }) - res.end(qs.stringify({ invalid: 'request_url' })) - }) - } else if (/authorize_error_message/.test(url)) { - const location = callback + '?' + qs.stringify({ error: { message: 'invalid' } }) - on.authorize({ url, headers, query }) - res.writeHead(302, { location }) - res.end() - } else if (/authorize_error_token/.test(url)) { - const location = callback as string - on.authorize({ url, headers, query }) - res.writeHead(302, { location }) - res.end() - } else if (/access_error_status/.test(url)) { - buffer(req, (form: any) => { - on.access({ url, headers, query, form, oauth }) - res.writeHead(500, { 'content-type': 'application/json' }) - res.end(JSON.stringify({ invalid: 'access_url' })) - }) - } else if (/profile_url/.test(url)) { - on.profile({ method, url, query, headers }) - res.writeHead(200, { 'content-type': 'application/json' }) - provider === 'flickr' - ? res.end('callback({"user": "simov"})') - : res.end(JSON.stringify({ user: 'simov' })) - } - }) - server.listen(port, () => resolve(server)) - }) - -const oauth2 = (port: number) => - new Promise((resolve) => { - const server = http.createServer() - let openid: any - server.on('request', (req, res) => { - const method = req.method - const url = req.url as string - const headers = req.headers - const query = _query(req) as any - const provider = /^\/(.*)\/.*/.exec(url) && /^\/(.*)\/.*/.exec(url)![1] - - if (/authorize_url/.test(url)) { - openid = (query.scope || []).includes('openid') - on.authorize({ provider, method, url, headers, query }) - if (query.response_mode === 'form_post') { - provider === 'apple' - ? res.end( - qs.stringify({ - code: 'code', - user: { name: { firstName: 'jon', lastName: 'doe' }, email: 'jon@doe.com' } - }) - ) - : res.end('code') - return - } - const location = - query.redirect_uri + - '?' + - (provider === 'intuit' - ? qs.stringify({ code: 'code', realmId: '123' }) - : qs.stringify({ code: 'code' })) - res.writeHead(302, { location }) - res.end() - } else if (/access_url/.test(url)) { - buffer(req, (form: any) => { - on.access({ provider, method, url, headers, query, form }) - res.writeHead(200, { 'content-type': 'application/json' }) - provider === 'concur' - ? res.end(' token refresh ') - : provider === 'withings' - ? res.end( - JSON.stringify({ - body: { - access_token: 'token', - refresh_token: 'refresh', - expires_in: 3600 - } - }) - ) - : res.end( - JSON.stringify({ - access_token: 'token', - refresh_token: 'refresh', - expires_in: 3600, - id_token: openid ? sign({ typ: 'JWT' }, { nonce: 'whatever' }, 'signature') : undefined, - open_id: provider === 'tiktok' ? 'id' : undefined, - uid: provider === 'weibo' ? 'id' : undefined, - openid: provider === 'wechat' ? 'openid' : undefined - }) - ) - }) - } else if (/authorize_error_message/.test(url)) { - on.authorize({ url, query, headers }) - const location = query.redirect_uri + '?' + qs.stringify({ error: { message: 'invalid' } }) - res.writeHead(302, { location }) - res.end() - } else if (/authorize_error_code/.test(url)) { - on.authorize({ url, query, headers }) - const location = query.redirect_uri as string - res.writeHead(302, { location }) - res.end() - } else if (/authorize_error_state_mismatch/.test(url)) { - on.authorize({ url, query, headers }) - const location = query.redirect_uri + '?' + qs.stringify({ code: 'code', state: 'whatever' }) - res.writeHead(302, { location }) - res.end() - } else if (/authorize_error_state_missing/.test(url)) { - on.authorize({ url, query, headers }) - const location = query.redirect_uri + '?' + qs.stringify({ code: 'code' }) - res.writeHead(302, { location }) - res.end() - } else if (/access_error_nonce_mismatch/.test(url)) { - buffer(req, (form: any) => { - on.access({ method, url, query, headers, form }) - res.writeHead(200, { 'content-type': 'application/json' }) - res.end( - JSON.stringify({ - id_token: sign({ typ: 'JWT' }, { nonce: 'whatever' }, 'signature') - }) - ) - }) - } else if (/access_error_nonce_missing/.test(url)) { - buffer(req, (form: any) => { - on.access({ method, url, query, headers, form }) - res.writeHead(200, { 'content-type': 'application/json' }) - res.end( - JSON.stringify({ - id_token: sign({ typ: 'JWT' }, {}, 'signature') - }) - ) - }) - } else if (/access_error_message/.test(url)) { - buffer(req, (form: any) => { - on.access({ method, url, query, headers, form }) - res.writeHead(200, { 'content-type': 'application/json' }) - res.end(JSON.stringify({ error: { message: 'invalid' } })) - }) - } else if (/access_error_status/.test(url)) { - buffer(req, (form: any) => { - on.access({ method, url, query, headers, form }) - res.writeHead(500, { 'content-type': 'application/json' }) - res.end(JSON.stringify({ invalid: 'access_url' })) - }) - } else if (/profile_url/.test(url)) { - if (method === 'POST') { - buffer(req, (form: any) => { - on.profile({ method, url, query, headers, form }) - res.writeHead(200, { 'content-type': 'application/json' }) - res.end(JSON.stringify({ id: 'test', user: 'simov' })) - }) - } else { - on.profile({ method, url, query, headers }) - res.writeHead(200, { 'content-type': 'application/json' }) - res.end(JSON.stringify({ id: 'test', user: 'simov' })) - } - } else if (/profile_error/.test(url)) { - on.profile({ method, url, query, headers }) - res.writeHead(400, { 'content-type': 'application/json' }) - res.end(JSON.stringify({ error: { message: 'Not Found' } })) - } - }) - server.listen(port, () => resolve(server)) - }) - -const on = { - request: (_opts: any) => {}, - authorize: (_opts: any) => {}, - access: (_opts: any) => {}, - profile: (_opts: any) => {} -} diff --git a/packages/authentication-oauth/tsconfig.json b/packages/authentication-oauth/tsconfig.json deleted file mode 100644 index 316fd41336..0000000000 --- a/packages/authentication-oauth/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig", - "include": [ - "src/**/*.ts" - ], - "compilerOptions": { - "outDir": "lib" - } -} diff --git a/packages/authentication/CHANGELOG.md b/packages/authentication/CHANGELOG.md deleted file mode 100644 index fe93ba4c54..0000000000 --- a/packages/authentication/CHANGELOG.md +++ /dev/null @@ -1,1858 +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.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/authentication - -## [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/authentication - -## [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/authentication - -## [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/authentication - -## [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/authentication - -## [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/authentication - -## [5.0.25](https://github.com/feathersjs/feathers/compare/v5.0.24...v5.0.25) (2024-05-03) - -### Bug Fixes - -- Reduce usage of lodash ([#3455](https://github.com/feathersjs/feathers/issues/3455)) ([8ce807a](https://github.com/feathersjs/feathers/commit/8ce807a5ca53ff5b8d5107a0656c6329404e6e6c)) - -## [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/authentication - -## [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/authentication - -## [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/authentication - -## [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/authentication - -## [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/authentication - -## [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/authentication - -## [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/authentication - -## [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/authentication - -## [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/authentication - -## [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/authentication - -## [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/authentication - -## [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/authentication - -## [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/authentication - -## [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/authentication - -## [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/authentication - -## [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/authentication - -## [5.0.6](https://github.com/feathersjs/feathers/compare/v5.0.5...v5.0.6) (2023-06-15) - -### Bug Fixes - -- **authentication:** Export JwtVerifyOptions ([#3214](https://github.com/feathersjs/feathers/issues/3214)) ([d59896e](https://github.com/feathersjs/feathers/commit/d59896eb0229f1490c712f19cf84eb2bcf123698)) - -## [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/authentication - -## [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/authentication - -# [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/authentication - -# [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/authentication - -# [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/authentication - -# [5.0.0-pre.36](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.35...v5.0.0-pre.36) (2023-01-29) - -### Bug Fixes - -- Update all dependencies ([#3024](https://github.com/feathersjs/feathers/issues/3024)) ([283dc47](https://github.com/feathersjs/feathers/commit/283dc4798d85584bc031e6e54b83b4ea77d1edd0)) - -# [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) - -### Bug Fixes - -- **authentication:** Fix order of connection and login event handling ([#2909](https://github.com/feathersjs/feathers/issues/2909)) ([801a503](https://github.com/feathersjs/feathers/commit/801a503425062e27f2a32b91493b6ffae3822626)) -- **core:** `context.type` for around hooks ([#2890](https://github.com/feathersjs/feathers/issues/2890)) ([d606ac6](https://github.com/feathersjs/feathers/commit/d606ac660fd5335c95206784fea36530dd2e851a)) - -### Features - -- **schema:** Virtual property resolvers ([#2900](https://github.com/feathersjs/feathers/issues/2900)) ([7d03b57](https://github.com/feathersjs/feathers/commit/7d03b57ae2f633bdd4a368e0d5955011fbd6c329)) - -# [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/authentication - -# [5.0.0-pre.32](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.31...v5.0.0-pre.32) (2022-10-26) - -### Bug Fixes - -- **authentication:** Improve logout and disconnect connection handling ([#2813](https://github.com/feathersjs/feathers/issues/2813)) ([dd77379](https://github.com/feathersjs/feathers/commit/dd77379d8bdcd32d529bef912e672639e4899823)) - -# [5.0.0-pre.31](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.30...v5.0.0-pre.31) (2022-10-12) - -### Features - -- **cli:** Generate full client test suite and improve typed client ([#2788](https://github.com/feathersjs/feathers/issues/2788)) ([57119b6](https://github.com/feathersjs/feathers/commit/57119b6bb2797f7297cf054268a248c093ecd538)) - -# [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)) -- **schema:** Make schemas validation library independent and add TypeBox support ([#2772](https://github.com/feathersjs/feathers/issues/2772)) ([44172d9](https://github.com/feathersjs/feathers/commit/44172d99b566d11d9ceda04f1d0bf72b6d05ce76)) - -# [5.0.0-pre.29](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.28...v5.0.0-pre.29) (2022-09-16) - -### Features - -- **authentication-oauth:** Koa and transport independent oAuth authentication ([#2737](https://github.com/feathersjs/feathers/issues/2737)) ([9231525](https://github.com/feathersjs/feathers/commit/9231525a24bb790ba9c5d940f2867a9c727691c9)) - -# [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/authentication - -# [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/authentication - -# [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/authentication - -# [5.0.0-pre.24](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.23...v5.0.0-pre.24) (2022-06-21) - -### Bug Fixes - -- **authentication:** Add safe dispatch data for authentication requests ([#2662](https://github.com/feathersjs/feathers/issues/2662)) ([d8104a1](https://github.com/feathersjs/feathers/commit/d8104a19ee9181e6a5ea81014af29ff9a3c28a8a)) - -# [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/authentication - -# [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/authentication - -# [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/authentication - -# [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) - -### Features - -- **typescript:** Improve adapter typings ([#2605](https://github.com/feathersjs/feathers/issues/2605)) ([3b2ca0a](https://github.com/feathersjs/feathers/commit/3b2ca0a6a8e03e8390272c4d7e930b4bffdaacf5)) -- **typescript:** Improve params and query typeability ([#2600](https://github.com/feathersjs/feathers/issues/2600)) ([df28b76](https://github.com/feathersjs/feathers/commit/df28b7619161f1df5e700326f52cca1a92dc5d28)) - -# [5.0.0-pre.18](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.17...v5.0.0-pre.18) (2022-04-11) - -### Features - -- **authentication:** Add setup method for auth strategies ([#1611](https://github.com/feathersjs/feathers/issues/1611)) ([a3c3581](https://github.com/feathersjs/feathers/commit/a3c35814dccdbbf6de96f04f60b226ce206c6dbe)) -- **configuration:** Allow app configuration to be validated against a schema ([#2590](https://github.com/feathersjs/feathers/issues/2590)) ([a268f86](https://github.com/feathersjs/feathers/commit/a268f86da92a8ada14ed11ab456aac0a4bba5bb0)) - -# [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/authentication - -# [5.0.0-pre.16](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.15...v5.0.0-pre.16) (2022-01-12) - -### Features - -- **express, koa:** make transports similar ([#2486](https://github.com/feathersjs/feathers/issues/2486)) ([26aa937](https://github.com/feathersjs/feathers/commit/26aa937c114fb8596dfefc599b1f53cead69c159)) - -# [5.0.0-pre.15](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.14...v5.0.0-pre.15) (2021-11-27) - -### Bug Fixes - -- **typescript:** Overall typing improvements ([#2478](https://github.com/feathersjs/feathers/issues/2478)) ([b8eb804](https://github.com/feathersjs/feathers/commit/b8eb804158556d9651a8607e3c3fda15e0bfd110)) - -### Features - -- **authentication-oauth:** Allow dynamic oAuth redirect ([#2469](https://github.com/feathersjs/feathers/issues/2469)) ([b7143d4](https://github.com/feathersjs/feathers/commit/b7143d4c0fbe961e714f79512be04449b9bbd7d9)) - -# [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/authentication - -# [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/authentication - -# [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/authentication - -# [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/authentication - -# [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/authentication - -# [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/authentication - -# [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/authentication - -# [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/authentication - -# [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/authentication - -# [5.0.0-pre.5](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.4...v5.0.0-pre.5) (2021-06-23) - -### Bug Fixes - -- **hooks:** Migrate built-in hooks and allow backwards compatibility ([#2358](https://github.com/feathersjs/feathers/issues/2358)) ([759c5a1](https://github.com/feathersjs/feathers/commit/759c5a19327a731af965c3604119393b3d09a406)) -- **koa:** Use extended query parser for compatibility ([#2397](https://github.com/feathersjs/feathers/issues/2397)) ([b2944ba](https://github.com/feathersjs/feathers/commit/b2944bac3ec6d5ecc80dc518cd4e58093692db74)) - -### Features - -- **adapter-commons:** Add support for params.adapter option and move memory adapter to @feathersjs/memory ([#2367](https://github.com/feathersjs/feathers/issues/2367)) ([a43e7da](https://github.com/feathersjs/feathers/commit/a43e7da22b6b981a96d1321736ea9a0cb924fb4f)) - -# [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/authentication - -# [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)) - -### Features - -- **dependencies:** Remove direct debug dependency ([#2296](https://github.com/feathersjs/feathers/issues/2296)) ([501d416](https://github.com/feathersjs/feathers/commit/501d4164d30c6a126906dc640cdfdc82207ba34a)) - -# [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/authentication - -# [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/authentication - -# [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)) - -### Features - -- Application service types default to any ([#1566](https://github.com/feathersjs/feathers/issues/1566)) ([d93ba9a](https://github.com/feathersjs/feathers/commit/d93ba9a17edd20d3397bb00f4f6e82e804e42ed6)) -- Feathers v5 core refactoring and features ([#2255](https://github.com/feathersjs/feathers/issues/2255)) ([2dafb7c](https://github.com/feathersjs/feathers/commit/2dafb7ce14ba57406aeec13d10ca45b1e709bee9)) - -# [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) - -**Note:** Version bump only for package @feathersjs/authentication - -# [5.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v4.5.4...v5.0.0-pre.0) (2020-05-19) - -## [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/authentication - -## [4.5.10](https://github.com/feathersjs/feathers/compare/v4.5.9...v4.5.10) (2020-11-08) - -### Bug Fixes - -- **authentication:** consistent response return between local and jwt strategy ([#2042](https://github.com/feathersjs/feathers/issues/2042)) ([8d25be1](https://github.com/feathersjs/feathers/commit/8d25be101a2593a9e789375c928a07780b9e28cf)) - -## [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/authentication - -## [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/authentication - -## [4.5.7](https://github.com/feathersjs/feathers/compare/v4.5.6...v4.5.7) (2020-07-24) - -### Bug Fixes - -- **authentication:** Add JWT getEntityQuery ([#2013](https://github.com/feathersjs/feathers/issues/2013)) ([e0e7fb5](https://github.com/feathersjs/feathers/commit/e0e7fb5162940fe776731283b40026c61d9c8a33)) - -## [4.5.6](https://github.com/feathersjs/feathers/compare/v4.5.5...v4.5.6) (2020-07-12) - -### Bug Fixes - -- **authentication:** Omit query in JWT strategy ([#2011](https://github.com/feathersjs/feathers/issues/2011)) ([04ce7e9](https://github.com/feathersjs/feathers/commit/04ce7e98515fe9d495cd0e83e0da097e9bcd7382)) - -## [4.5.5](https://github.com/feathersjs/feathers/compare/v4.5.4...v4.5.5) (2020-07-11) - -### Bug Fixes - -- **authentication:** Include query params when authenticating via authenticate hook [#2009](https://github.com/feathersjs/feathers/issues/2009) ([4cdb7bf](https://github.com/feathersjs/feathers/commit/4cdb7bf2898385ddac7a1692bc9ac2f6cf5ad446)) - -## [4.5.3](https://github.com/feathersjs/feathers/compare/v4.5.2...v4.5.3) (2020-04-17) - -### Bug Fixes - -- **authentication:** Remove entity from connection information on logout ([#1889](https://github.com/feathersjs/feathers/issues/1889)) ([b062753](https://github.com/feathersjs/feathers/commit/b0627530d61babe15dd84369d3093ccae4b780ca)) - -## [4.5.2](https://github.com/feathersjs/feathers/compare/v4.5.1...v4.5.2) (2020-03-04) - -### Bug Fixes - -- **authentication:** Improve JWT strategy configuration error message ([#1844](https://github.com/feathersjs/feathers/issues/1844)) ([2c771db](https://github.com/feathersjs/feathers/commit/2c771dbb22d53d4f7de3c3f514e57afa1a186322)) - -## [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/authentication - -# [4.5.0](https://github.com/feathersjs/feathers/compare/v4.4.3...v4.5.0) (2020-01-18) - -### Bug Fixes - -- Add `params.authentication` type, remove `hook.connection` type ([#1732](https://github.com/feathersjs/feathers/issues/1732)) ([d46b7b2](https://github.com/feathersjs/feathers/commit/d46b7b2abac8862c0e4dbfce20d71b8b8a96692f)) - -## [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/authentication - -## [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/authentication - -# [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/authentication - -## [4.3.11](https://github.com/feathersjs/feathers/compare/v4.3.10...v4.3.11) (2019-11-11) - -### Bug Fixes - -- **authentication:** Retain object references in authenticate hook ([#1675](https://github.com/feathersjs/feathers/issues/1675)) ([e1939be](https://github.com/feathersjs/feathers/commit/e1939be19d4e79d3f5e2fe69ba894a11c627ae99)) - -## [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/authentication - -## [4.3.9](https://github.com/feathersjs/feathers/compare/v4.3.8...v4.3.9) (2019-10-26) - -### Bug Fixes - -- Add jsonwebtoken TypeScript type dependency ([317c80a](https://github.com/feathersjs/feathers/commit/317c80a9205e8853bb830a12c3aa1a19e95f9abc)) -- 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/authentication - -## [4.3.5](https://github.com/feathersjs/feathers/compare/v4.3.4...v4.3.5) (2019-10-07) - -### Bug Fixes - -- Authentication type improvements and timeout fix ([#1605](https://github.com/feathersjs/feathers/issues/1605)) ([19854d3](https://github.com/feathersjs/feathers/commit/19854d3)) -- Improve error message when authentication strategy is not allowed ([#1600](https://github.com/feathersjs/feathers/issues/1600)) ([317a312](https://github.com/feathersjs/feathers/commit/317a312)) - -## [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/authentication - -## [4.3.3](https://github.com/feathersjs/feathers/compare/v4.3.2...v4.3.3) (2019-09-21) - -### Bug Fixes - -- check for undefined access token ([#1571](https://github.com/feathersjs/feathers/issues/1571)) ([976369d](https://github.com/feathersjs/feathers/commit/976369d)) -- Small improvements in dependencies and code sturcture ([#1562](https://github.com/feathersjs/feathers/issues/1562)) ([42c13e2](https://github.com/feathersjs/feathers/commit/42c13e2)) - -## [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/authentication - -## [4.3.1](https://github.com/feathersjs/feathers/compare/v4.3.0...v4.3.1) (2019-09-09) - -### Bug Fixes - -- Use long-timeout for JWT expiration timers ([#1552](https://github.com/feathersjs/feathers/issues/1552)) ([65637ec](https://github.com/feathersjs/feathers/commit/65637ec)) - -# [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/authentication - -# [4.3.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.3...v4.3.0-pre.4) (2019-08-22) - -### Bug Fixes - -- Fix auth publisher mistake ([08bad61](https://github.com/feathersjs/feathers/commit/08bad61)) - -# [4.3.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.2...v4.3.0-pre.3) (2019-08-19) - -### Bug Fixes - -- Expire and remove authenticated real-time connections ([#1512](https://github.com/feathersjs/feathers/issues/1512)) ([2707c33](https://github.com/feathersjs/feathers/commit/2707c33)) -- Update all dependencies ([7d53a00](https://github.com/feathersjs/feathers/commit/7d53a00)) - -### Features - -- Let strategies handle the connection ([#1510](https://github.com/feathersjs/feathers/issues/1510)) ([4329feb](https://github.com/feathersjs/feathers/commit/4329feb)) - -# [4.3.0-pre.2](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.1...v4.3.0-pre.2) (2019-08-02) - -### Bug Fixes - -- Add getEntityId to JWT strategy and fix legacy Socket authentication ([#1488](https://github.com/feathersjs/feathers/issues/1488)) ([9a3b324](https://github.com/feathersjs/feathers/commit/9a3b324)) -- Add method to reliably get default authentication service ([#1470](https://github.com/feathersjs/feathers/issues/1470)) ([e542cb3](https://github.com/feathersjs/feathers/commit/e542cb3)) - -# [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/authentication - -# [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/authentication - -# [4.0.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.3...v4.0.0-pre.4) (2019-07-05) - -### Bug Fixes - -- Updated typings for ServiceMethods ([#1409](https://github.com/feathersjs/feathers/issues/1409)) ([b5ee7e2](https://github.com/feathersjs/feathers/commit/b5ee7e2)) - -# [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 - -- Make oAuth paths more consistent and improve authentication client ([#1377](https://github.com/feathersjs/feathers/issues/1377)) ([adb2543](https://github.com/feathersjs/feathers/commit/adb2543)) -- Set authenticated: true after successful authentication ([#1367](https://github.com/feathersjs/feathers/issues/1367)) ([9918cff](https://github.com/feathersjs/feathers/commit/9918cff)) -- Typings fix and improvements. ([#1364](https://github.com/feathersjs/feathers/issues/1364)) ([515b916](https://github.com/feathersjs/feathers/commit/515b916)) -- 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 - -- Throw NotAuthenticated on token verification errors ([#1357](https://github.com/feathersjs/feathers/issues/1357)) ([e0120df](https://github.com/feathersjs/feathers/commit/e0120df)) - -# [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 - -- Always require strategy parameter in authentication ([#1327](https://github.com/feathersjs/feathers/issues/1327)) ([d4a8021](https://github.com/feathersjs/feathers/commit/d4a8021)) -- Bring back params.authenticated ([#1317](https://github.com/feathersjs/feathers/issues/1317)) ([a0ffd5e](https://github.com/feathersjs/feathers/commit/a0ffd5e)) -- Improve authentication parameter handling ([#1333](https://github.com/feathersjs/feathers/issues/1333)) ([6e77204](https://github.com/feathersjs/feathers/commit/6e77204)) -- Merge httpStrategies and authStrategies option ([#1308](https://github.com/feathersjs/feathers/issues/1308)) ([afa4d55](https://github.com/feathersjs/feathers/commit/afa4d55)) -- Rename jwtStrategies option to authStrategies ([#1305](https://github.com/feathersjs/feathers/issues/1305)) ([4aee151](https://github.com/feathersjs/feathers/commit/4aee151)) - -### Features - -- Change and *JWT methods to *accessToken ([#1304](https://github.com/feathersjs/feathers/issues/1304)) ([5ac826b](https://github.com/feathersjs/feathers/commit/5ac826b)) - -# [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 - -- Added path and method in to express request for passport ([#1112](https://github.com/feathersjs/feathers/issues/1112)) ([afa1cb4](https://github.com/feathersjs/feathers/commit/afa1cb4)) -- Authentication core improvements ([#1260](https://github.com/feathersjs/feathers/issues/1260)) ([c5dc7a2](https://github.com/feathersjs/feathers/commit/c5dc7a2)) -- Improve JWT authentication option handling ([#1261](https://github.com/feathersjs/feathers/issues/1261)) ([31b956b](https://github.com/feathersjs/feathers/commit/31b956b)) -- Make Mocha a proper devDependency for every repository ([#1053](https://github.com/feathersjs/feathers/issues/1053)) ([9974803](https://github.com/feathersjs/feathers/commit/9974803)) -- Only merge authenticated property on update ([8a564f7](https://github.com/feathersjs/feathers/commit/8a564f7)) -- reduce authentication connection hook complexity and remove unnecessary checks ([fa94b2f](https://github.com/feathersjs/feathers/commit/fa94b2f)) -- Update all dependencies to latest ([#1206](https://github.com/feathersjs/feathers/issues/1206)) ([e51e0f6](https://github.com/feathersjs/feathers/commit/e51e0f6)) -- **authentication:** Fall back when req.app is not the application when emitting events ([#1185](https://github.com/feathersjs/feathers/issues/1185)) ([6a534f0](https://github.com/feathersjs/feathers/commit/6a534f0)) -- Update adapter common tests ([#1135](https://github.com/feathersjs/feathers/issues/1135)) ([8166dda](https://github.com/feathersjs/feathers/commit/8166dda)) -- **docs/new-features:** syntax highlighting ([#347](https://github.com/feathersjs/feathers/issues/347)) ([4ab7c95](https://github.com/feathersjs/feathers/commit/4ab7c95)) -- **package:** update @feathersjs/commons to version 2.0.0 ([#692](https://github.com/feathersjs/feathers/issues/692)) ([ca665ab](https://github.com/feathersjs/feathers/commit/ca665ab)) -- **package:** update debug to version 3.0.0 ([#555](https://github.com/feathersjs/feathers/issues/555)) ([f788804](https://github.com/feathersjs/feathers/commit/f788804)) -- **package:** update jsonwebtoken to version 8.0.0 ([#567](https://github.com/feathersjs/feathers/issues/567)) ([6811626](https://github.com/feathersjs/feathers/commit/6811626)) -- **package:** update ms to version 2.0.0 ([#509](https://github.com/feathersjs/feathers/issues/509)) ([7e4b0b6](https://github.com/feathersjs/feathers/commit/7e4b0b6)) -- **package:** update passport to version 0.4.0 ([#558](https://github.com/feathersjs/feathers/issues/558)) ([dcb14a5](https://github.com/feathersjs/feathers/commit/dcb14a5)) - -### Features - -- @feathersjs/authentication-oauth ([#1299](https://github.com/feathersjs/feathers/issues/1299)) ([656bae7](https://github.com/feathersjs/feathers/commit/656bae7)) -- Add AuthenticationBaseStrategy and make authentication option handling more explicit ([#1284](https://github.com/feathersjs/feathers/issues/1284)) ([2667d92](https://github.com/feathersjs/feathers/commit/2667d92)) -- 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)) -- Authentication v3 local authentication ([#1211](https://github.com/feathersjs/feathers/issues/1211)) ([0fa5f7c](https://github.com/feathersjs/feathers/commit/0fa5f7c)) -- Remove (hook, next) signature and SKIP support ([#1269](https://github.com/feathersjs/feathers/issues/1269)) ([211c0f8](https://github.com/feathersjs/feathers/commit/211c0f8)) -- Support params symbol to skip authenticate hook ([#1296](https://github.com/feathersjs/feathers/issues/1296)) ([d16cf4d](https://github.com/feathersjs/feathers/commit/d16cf4d)) - -### BREAKING CHANGES - -- Update authentication strategies for @feathersjs/authentication v3 - -## [2.1.16](https://github.com/feathersjs/feathers/compare/@feathersjs/authentication@2.1.15...@feathersjs/authentication@2.1.16) (2019-01-26) - -### Bug Fixes - -- **authentication:** Fall back when req.app is not the application when emitting events ([#1185](https://github.com/feathersjs/feathers/issues/1185)) ([6a534f0](https://github.com/feathersjs/feathers/commit/6a534f0)) - -## [2.1.15](https://github.com/feathersjs/feathers/compare/@feathersjs/authentication@2.1.14...@feathersjs/authentication@2.1.15) (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)) - - - -## [2.1.14](https://github.com/feathersjs/feathers/compare/@feathersjs/authentication@2.1.13...@feathersjs/authentication@2.1.14) (2018-12-16) - -### Bug Fixes - -- Added path and method in to express request for passport ([#1112](https://github.com/feathersjs/feathers/issues/1112)) ([afa1cb4](https://github.com/feathersjs/feathers/commit/afa1cb4)) - - - -## [2.1.13](https://github.com/feathersjs/feathers/compare/@feathersjs/authentication@2.1.12...@feathersjs/authentication@2.1.13) (2018-10-26) - -**Note:** Version bump only for package @feathersjs/authentication - - - -## [2.1.12](https://github.com/feathersjs/feathers/compare/@feathersjs/authentication@2.1.11...@feathersjs/authentication@2.1.12) (2018-10-25) - -### 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)) -- Only merge authenticated property on update ([8a564f7](https://github.com/feathersjs/feathers/commit/8a564f7)) - - - -## [2.1.11](https://github.com/feathersjs/feathers/compare/@feathersjs/authentication@2.1.10...@feathersjs/authentication@2.1.11) (2018-09-21) - -**Note:** Version bump only for package @feathersjs/authentication - - - -## [2.1.10](https://github.com/feathersjs/feathers/compare/@feathersjs/authentication@2.1.9...@feathersjs/authentication@2.1.10) (2018-09-17) - -**Note:** Version bump only for package @feathersjs/authentication - - - -## [2.1.9](https://github.com/feathersjs/feathers/compare/@feathersjs/authentication@2.1.8...@feathersjs/authentication@2.1.9) (2018-09-02) - -**Note:** Version bump only for package @feathersjs/authentication - - - -## 2.1.8 - -- Migrate to Monorepo ([feathers#462](https://github.com/feathersjs/feathers/issues/462)) - -## [v2.1.7](https://github.com/feathersjs/authentication/tree/v2.1.7) (2018-06-29) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v2.1.6...v2.1.7) - -**Fixed bugs:** - -- XXXOrRestrict undermines provider \(security\) logic [\#395](https://github.com/feathersjs/authentication/issues/395) - -**Closed issues:** - -- Customize response of authentication service [\#679](https://github.com/feathersjs/authentication/issues/679) -- hook.params.user is null using REST [\#678](https://github.com/feathersjs/authentication/issues/678) -- Can't store JWT token to cookie on REST client [\#676](https://github.com/feathersjs/authentication/issues/676) -- Is there a way to get req.user without using the authentication middleware? [\#675](https://github.com/feathersjs/authentication/issues/675) - -**Merged pull requests:** - -- Remove subject from the JWT verification options [\#686](https://github.com/feathersjs/authentication/pull/686) ([rasendubi](https://github.com/rasendubi)) -- Replaced feathers.static with express.static [\#685](https://github.com/feathersjs/authentication/pull/685) ([georgehorrell](https://github.com/georgehorrell)) -- Remove dependency on Express and Express middleware [\#683](https://github.com/feathersjs/authentication/pull/683) ([daffl](https://github.com/daffl)) -- Update sinon to the latest version 🚀 [\#681](https://github.com/feathersjs/authentication/pull/681) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v2.1.6](https://github.com/feathersjs/authentication/tree/v2.1.6) (2018-06-01) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v2.1.5...v2.1.6) - -**Closed issues:** - -- Authentication local strategy not working with a Custom User service [\#672](https://github.com/feathersjs/authentication/issues/672) -- CLI command bug: 'Feathers generate authentication' produces bad working 'users' service [\#670](https://github.com/feathersjs/authentication/issues/670) -- config\default.json generated without callbackURL config needed to set redirect URL for Google Outh2 [\#669](https://github.com/feathersjs/authentication/issues/669) -- HELP WANTED: Authentication strategy 'jwt' is not registered. [\#668](https://github.com/feathersjs/authentication/issues/668) -- Authenticate shows error: No auth token [\#667](https://github.com/feathersjs/authentication/issues/667) -- authentication - Method: remove [\#662](https://github.com/feathersjs/authentication/issues/662) -- NotAuthenticated: jwt expired [\#633](https://github.com/feathersjs/authentication/issues/633) -- Authentication via phone number [\#616](https://github.com/feathersjs/authentication/issues/616) -- Persist auth tokens on db [\#569](https://github.com/feathersjs/authentication/issues/569) -- Tighter integration with feathers-authentication-management [\#393](https://github.com/feathersjs/authentication/issues/393) - -**Merged pull requests:** - -- Fix tests to work with latest Sinon [\#674](https://github.com/feathersjs/authentication/pull/674) ([daffl](https://github.com/daffl)) -- add option to allowUnauthenticated [\#599](https://github.com/feathersjs/authentication/pull/599) ([MichaelErmer](https://github.com/MichaelErmer)) - -## [v2.1.5](https://github.com/feathersjs/authentication/tree/v2.1.5) (2018-04-16) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v2.1.4...v2.1.5) - -**Closed issues:** - -- feathersjs Invalid token: expired [\#661](https://github.com/feathersjs/authentication/issues/661) -- Safari and iOS facebook login can't redirect back, but others can. [\#651](https://github.com/feathersjs/authentication/issues/651) - -**Merged pull requests:** - -- Remove payload and user entity on logout. [\#665](https://github.com/feathersjs/authentication/pull/665) ([bertho-zero](https://github.com/bertho-zero)) - -## [v2.1.4](https://github.com/feathersjs/authentication/tree/v2.1.4) (2018-04-12) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v2.1.3...v2.1.4) - -**Closed issues:** - -- Column "createdAt" does not exist" in Autentication [\#660](https://github.com/feathersjs/authentication/issues/660) -- How to make a user automatically logined on server side? [\#659](https://github.com/feathersjs/authentication/issues/659) -- authentication-jwt functional example [\#657](https://github.com/feathersjs/authentication/issues/657) -- "No auth token" with auth0 when following the guide [\#655](https://github.com/feathersjs/authentication/issues/655) -- Service returns \[No Auth Token\] same by passing Authorization Token on HEADER [\#641](https://github.com/feathersjs/authentication/issues/641) - -**Merged pull requests:** - -- Throw an error for unavailable strategy [\#663](https://github.com/feathersjs/authentication/pull/663) ([daffl](https://github.com/daffl)) -- Update sinon to the latest version 🚀 [\#656](https://github.com/feathersjs/authentication/pull/656) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v2.1.3](https://github.com/feathersjs/authentication/tree/v2.1.3) (2018-03-16) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v2.1.2...v2.1.3) - -**Closed issues:** - -- ts [\#647](https://github.com/feathersjs/authentication/issues/647) -- Using /auth/facebook gives a 404 from vue-router [\#643](https://github.com/feathersjs/authentication/issues/643) -- Crash after upgrade to feathersjs v3 [\#642](https://github.com/feathersjs/authentication/issues/642) -- SameSite cookie option [\#640](https://github.com/feathersjs/authentication/issues/640) -- context.params.user is empty object [\#635](https://github.com/feathersjs/authentication/issues/635) -- Token is undefined for authenticated user [\#500](https://github.com/feathersjs/authentication/issues/500) -- 1.x: logout timers need to be moved [\#467](https://github.com/feathersjs/authentication/issues/467) - -**Merged pull requests:** - -- Merge auk to master [\#653](https://github.com/feathersjs/authentication/pull/653) ([wnxhaja](https://github.com/wnxhaja)) -- Update ws to the latest version 🚀 [\#645](https://github.com/feathersjs/authentication/pull/645) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update sinon-chai to the latest version 🚀 [\#644](https://github.com/feathersjs/authentication/pull/644) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v2.1.2](https://github.com/feathersjs/authentication/tree/v2.1.2) (2018-02-14) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v2.1.1...v2.1.2) - -**Fixed bugs:** - -- hook failed with auth & sync [\#540](https://github.com/feathersjs/authentication/issues/540) -- JWT Cookie [\#389](https://github.com/feathersjs/authentication/issues/389) - -**Closed issues:** - -- forgot password [\#638](https://github.com/feathersjs/authentication/issues/638) -- registered many authentication services [\#634](https://github.com/feathersjs/authentication/issues/634) -- TypeError: Cannot read property '\_strategy' of undefined [\#632](https://github.com/feathersjs/authentication/issues/632) -- How to change 5000ms timeout? [\#628](https://github.com/feathersjs/authentication/issues/628) -- cookie reused from server in SSR app [\#619](https://github.com/feathersjs/authentication/issues/619) -- Express middleware not setCookie [\#617](https://github.com/feathersjs/authentication/issues/617) -- Server to Server Authentication Question [\#612](https://github.com/feathersjs/authentication/issues/612) -- No way to share token between socket-rest-express [\#607](https://github.com/feathersjs/authentication/issues/607) -- 404 when accessing route using customer authentication [\#579](https://github.com/feathersjs/authentication/issues/579) -- \[question\] is it possible to protect by role a create method? [\#564](https://github.com/feathersjs/authentication/issues/564) -- Authentication with server-side rendering [\#560](https://github.com/feathersjs/authentication/issues/560) -- Problem authenticating using REST middleware [\#495](https://github.com/feathersjs/authentication/issues/495) -- A supposed way to auth requests from SSR to Feathers API [\#469](https://github.com/feathersjs/authentication/issues/469) -- rename `app.authenticate\(\)` to `app.\_authenticate\(\)` [\#468](https://github.com/feathersjs/authentication/issues/468) - -**Merged pull requests:** - -- Delete slack link [\#637](https://github.com/feathersjs/authentication/pull/637) ([vodniciarv](https://github.com/vodniciarv)) -- Update @feathersjs/authentication-jwt to the latest version 🚀 [\#631](https://github.com/feathersjs/authentication/pull/631) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update mocha to the latest version 🚀 [\#629](https://github.com/feathersjs/authentication/pull/629) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update ws to the latest version 🚀 [\#625](https://github.com/feathersjs/authentication/pull/625) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Options merged [\#611](https://github.com/feathersjs/authentication/pull/611) ([Makingweb](https://github.com/Makingweb)) - -## [v2.1.1](https://github.com/feathersjs/authentication/tree/v2.1.1) (2018-01-03) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v2.1.0...v2.1.1) - -**Closed issues:** - -- Deleted user successfully signs in using JWT [\#615](https://github.com/feathersjs/authentication/issues/615) -- Feathers.authenticate gives window undefined \(server-rendered\) [\#573](https://github.com/feathersjs/authentication/issues/573) -- Be careful with discard\('password'\) in user [\#434](https://github.com/feathersjs/authentication/issues/434) - -**Merged pull requests:** - -- Update readme to correspond with latest release [\#621](https://github.com/feathersjs/authentication/pull/621) ([daffl](https://github.com/daffl)) -- Update semistandard to the latest version 🚀 [\#620](https://github.com/feathersjs/authentication/pull/620) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update mongodb to the latest version 🚀 [\#618](https://github.com/feathersjs/authentication/pull/618) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v2.1.0](https://github.com/feathersjs/authentication/tree/v2.1.0) (2017-12-06) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v2.0.1...v2.1.0) - -**Closed issues:** - -- Method "Remove" from Authentication Service gives Internal Server Error when using JWT Authentication with Cookies. [\#606](https://github.com/feathersjs/authentication/issues/606) -- Anonymous Authentication fails over Socket.io [\#457](https://github.com/feathersjs/authentication/issues/457) - -**Merged pull requests:** - -- Always prevent publishing of authentication events [\#614](https://github.com/feathersjs/authentication/pull/614) ([daffl](https://github.com/daffl)) -- Update feathers-memory to the latest version 🚀 [\#613](https://github.com/feathersjs/authentication/pull/613) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v2.0.1](https://github.com/feathersjs/authentication/tree/v2.0.1) (2017-11-16) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v2.0.0...v2.0.1) - -**Merged pull requests:** - -- Add default export for better ES module \(TypeScript\) compatibility [\#605](https://github.com/feathersjs/authentication/pull/605) ([daffl](https://github.com/daffl)) - -## [v2.0.0](https://github.com/feathersjs/authentication/tree/v2.0.0) (2017-11-09) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v1.3.1...v2.0.0) - -**Closed issues:** - -- is there a way to detect if the token used is correct or not ? [\#601](https://github.com/feathersjs/authentication/issues/601) -- option for non-JWT based session [\#597](https://github.com/feathersjs/authentication/issues/597) - -**Merged pull requests:** - -- Update nsp to the latest version 🚀 [\#603](https://github.com/feathersjs/authentication/pull/603) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v1.3.1](https://github.com/feathersjs/authentication/tree/v1.3.1) (2017-11-03) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v1.4.1...v1.3.1) - -**Merged pull requests:** - -- Only set the JWT UUID if it is not already set [\#600](https://github.com/feathersjs/authentication/pull/600) ([daffl](https://github.com/daffl)) - -## [v1.4.1](https://github.com/feathersjs/authentication/tree/v1.4.1) (2017-11-01) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v1.4.0...v1.4.1) - -**Merged pull requests:** - -- Update dependencies for release [\#598](https://github.com/feathersjs/authentication/pull/598) ([daffl](https://github.com/daffl)) -- Finalize v3 dependency updates [\#596](https://github.com/feathersjs/authentication/pull/596) ([daffl](https://github.com/daffl)) -- Update Codeclimate coverage token [\#595](https://github.com/feathersjs/authentication/pull/595) ([daffl](https://github.com/daffl)) - -## [v1.4.0](https://github.com/feathersjs/authentication/tree/v1.4.0) (2017-10-25) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v1.3.0...v1.4.0) - -**Closed issues:** - -- An in-range update of socket.io-client is breaking the build 🚨 [\#588](https://github.com/feathersjs/authentication/issues/588) -- An in-range update of feathers-hooks is breaking the build 🚨 [\#587](https://github.com/feathersjs/authentication/issues/587) - -**Merged pull requests:** - -- Move to npm scope [\#594](https://github.com/feathersjs/authentication/pull/594) ([daffl](https://github.com/daffl)) -- Update to Feathers v3 \(Buzzard\) [\#592](https://github.com/feathersjs/authentication/pull/592) ([daffl](https://github.com/daffl)) -- Update to new plugin infrastructure [\#591](https://github.com/feathersjs/authentication/pull/591) ([daffl](https://github.com/daffl)) - -## [v1.3.0](https://github.com/feathersjs/authentication/tree/v1.3.0) (2017-10-24) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.7.13...v1.3.0) - -**Merged pull requests:** - -- updating the codeclimate setup [\#589](https://github.com/feathersjs/authentication/pull/589) ([ekryski](https://github.com/ekryski)) - -## [v0.7.13](https://github.com/feathersjs/authentication/tree/v0.7.13) (2017-10-23) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v1.2.7...v0.7.13) - -**Closed issues:** - -- Error authenticating! Error: Token provided to verifyJWT is missing or not a string ? [\#584](https://github.com/feathersjs/authentication/issues/584) -- Visual Studio Code Debug no authentication [\#583](https://github.com/feathersjs/authentication/issues/583) -- \[Feature Request\] Cloud DB's [\#581](https://github.com/feathersjs/authentication/issues/581) -- Request doesn't contain any headers when user service requested [\#578](https://github.com/feathersjs/authentication/issues/578) -- No way to pass Options to auth.express.authenticate. Needed for Google API refreshToken [\#576](https://github.com/feathersjs/authentication/issues/576) -- /auth/google 404 Not Found [\#574](https://github.com/feathersjs/authentication/issues/574) -- unique email not working while create [\#572](https://github.com/feathersjs/authentication/issues/572) -- authentication service not return token jwt [\#571](https://github.com/feathersjs/authentication/issues/571) -- typo in jwt default options [\#570](https://github.com/feathersjs/authentication/issues/570) -- Generate new app, Google-only auth, throws error [\#568](https://github.com/feathersjs/authentication/issues/568) -- An in-range update of feathers is breaking the build 🚨 [\#565](https://github.com/feathersjs/authentication/issues/565) -- Documentation not understanding [\#563](https://github.com/feathersjs/authentication/issues/563) -- Checking hook.params.headers.authorization [\#552](https://github.com/feathersjs/authentication/issues/552) -- Ability to send token as part of URL [\#546](https://github.com/feathersjs/authentication/issues/546) -- Anonymous Authentication [\#544](https://github.com/feathersjs/authentication/issues/544) -- Quote Error [\#519](https://github.com/feathersjs/authentication/issues/519) -- \[example\] CustomStrategy using passport-custom [\#516](https://github.com/feathersjs/authentication/issues/516) -- \[Epic\] Auth 2.0.0 [\#513](https://github.com/feathersjs/authentication/issues/513) -- ID set to null - Unable to delete with customer ID field. [\#422](https://github.com/feathersjs/authentication/issues/422) -- Prefixing socket events [\#418](https://github.com/feathersjs/authentication/issues/418) -- Passwordless auth [\#409](https://github.com/feathersjs/authentication/issues/409) -- How to authenticate the application client? not only the users [\#405](https://github.com/feathersjs/authentication/issues/405) -- Multi-factor Local Auth [\#5](https://github.com/feathersjs/authentication/issues/5) - -**Merged pull requests:** - -- Features/typescript fix [\#585](https://github.com/feathersjs/authentication/pull/585) ([TimMensch](https://github.com/TimMensch)) -- Update mocha to the latest version 🚀 [\#582](https://github.com/feathersjs/authentication/pull/582) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update sinon to the latest version 🚀 [\#580](https://github.com/feathersjs/authentication/pull/580) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update jsonwebtoken to the latest version 🚀 [\#567](https://github.com/feathersjs/authentication/pull/567) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Include Babel Polyfill for Node 4 [\#566](https://github.com/feathersjs/authentication/pull/566) ([daffl](https://github.com/daffl)) -- Update passport to the latest version 🚀 [\#558](https://github.com/feathersjs/authentication/pull/558) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Revert "Make feathers-authentication match security documents" [\#556](https://github.com/feathersjs/authentication/pull/556) ([ekryski](https://github.com/ekryski)) -- Update debug to the latest version 🚀 [\#555](https://github.com/feathersjs/authentication/pull/555) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Make feathers-authentication match security documents [\#554](https://github.com/feathersjs/authentication/pull/554) ([micaksica2](https://github.com/micaksica2)) -- Update sinon to the latest version 🚀 [\#551](https://github.com/feathersjs/authentication/pull/551) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update ws to the latest version 🚀 [\#549](https://github.com/feathersjs/authentication/pull/549) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update chai to the latest version 🚀 [\#543](https://github.com/feathersjs/authentication/pull/543) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- adding a default jwt uuid. Refs \#513 [\#539](https://github.com/feathersjs/authentication/pull/539) ([ekryski](https://github.com/ekryski)) -- Refresh token must have a user ID [\#419](https://github.com/feathersjs/authentication/pull/419) ([francisco-sanchez-molina](https://github.com/francisco-sanchez-molina)) - -## [v1.2.7](https://github.com/feathersjs/authentication/tree/v1.2.7) (2017-07-11) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v1.2.6...v1.2.7) - -**Closed issues:** - -- Connection without password [\#541](https://github.com/feathersjs/authentication/issues/541) -- email in lower case ? [\#538](https://github.com/feathersjs/authentication/issues/538) -- Im unable to ping feathers server from react native. [\#537](https://github.com/feathersjs/authentication/issues/537) -- whats the official way to open cors in feather ? [\#536](https://github.com/feathersjs/authentication/issues/536) -- Error options.service does not exist after initial auth setup [\#535](https://github.com/feathersjs/authentication/issues/535) -- LogoutTimer not being cleared correctly [\#532](https://github.com/feathersjs/authentication/issues/532) -- logoutTimer causing early logouts [\#404](https://github.com/feathersjs/authentication/issues/404) - -**Merged pull requests:** - -- fixed meta undefined error [\#542](https://github.com/feathersjs/authentication/pull/542) ([markacola](https://github.com/markacola)) - -## [v1.2.6](https://github.com/feathersjs/authentication/tree/v1.2.6) (2017-06-22) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v1.2.5...v1.2.6) - -**Closed issues:** - -- OAuth 2 login for cordova [\#530](https://github.com/feathersjs/authentication/issues/530) - -**Merged pull requests:** - -- Change cleartimeout\(\) to lt.clearTimeout\(\) [\#534](https://github.com/feathersjs/authentication/pull/534) ([wnxhaja](https://github.com/wnxhaja)) -- Update feathers-authentication-local to the latest version 🚀 [\#533](https://github.com/feathersjs/authentication/pull/533) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v1.2.5](https://github.com/feathersjs/authentication/tree/v1.2.5) (2017-06-21) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v1.2.4...v1.2.5) - -**Closed issues:** - -- Cannot read property 'user' of undefined - lib\socket\update-entity.js:26:104 [\#529](https://github.com/feathersjs/authentication/issues/529) -- Provider is undefined when using restrictToRoles [\#525](https://github.com/feathersjs/authentication/issues/525) -- How to make a request to an Endpoint that requires authentication from nodejs? [\#523](https://github.com/feathersjs/authentication/issues/523) - -**Merged pull requests:** - -- fixes several issues with update-entity w/ test cases [\#531](https://github.com/feathersjs/authentication/pull/531) ([jerfowler](https://github.com/jerfowler)) - -## [v1.2.4](https://github.com/feathersjs/authentication/tree/v1.2.4) (2017-06-08) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v1.2.3...v1.2.4) - -**Fixed bugs:** - -- User \(Entity\) needs to be updated on the socket after authentication [\#293](https://github.com/feathersjs/authentication/issues/293) - -**Closed issues:** - -- Express Middleware local -\> jwt does not authorize on redirect [\#518](https://github.com/feathersjs/authentication/issues/518) -- Issue with feathers-authentication [\#512](https://github.com/feathersjs/authentication/issues/512) -- User Authentication Missing Credentials error \(and subsequent nav authorization\) [\#508](https://github.com/feathersjs/authentication/issues/508) -- passport log failure [\#505](https://github.com/feathersjs/authentication/issues/505) -- authenticate with a custom username field \(rather than email\) [\#502](https://github.com/feathersjs/authentication/issues/502) -- app.get\('auth'\) vs app.get\('authentication'\) [\#497](https://github.com/feathersjs/authentication/issues/497) -- Can't get success authorization with pure feathers server [\#491](https://github.com/feathersjs/authentication/issues/491) - -**Merged pull requests:** - -- Test and fix for authenticate event with invalid data [\#524](https://github.com/feathersjs/authentication/pull/524) ([daffl](https://github.com/daffl)) -- Remove hook.data.payload [\#522](https://github.com/feathersjs/authentication/pull/522) ([marshallswain](https://github.com/marshallswain)) -- Update socket entity [\#521](https://github.com/feathersjs/authentication/pull/521) ([marshallswain](https://github.com/marshallswain)) -- Made each option, optional [\#515](https://github.com/feathersjs/authentication/pull/515) ([cranesandcaff](https://github.com/cranesandcaff)) -- Add feathers-authentication-hooks in readme [\#510](https://github.com/feathersjs/authentication/pull/510) ([bertho-zero](https://github.com/bertho-zero)) -- Update ms to the latest version 🚀 [\#509](https://github.com/feathersjs/authentication/pull/509) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Fix default authentication config keys [\#506](https://github.com/feathersjs/authentication/pull/506) ([ekryski](https://github.com/ekryski)) - -## [v1.2.3](https://github.com/feathersjs/authentication/tree/v1.2.3) (2017-05-10) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v1.2.2...v1.2.3) - -**Closed issues:** - -- Validating custom express routes [\#498](https://github.com/feathersjs/authentication/issues/498) -- Payload won't include userId when logging in with stored localStorage token [\#496](https://github.com/feathersjs/authentication/issues/496) -- How to send oauth token authentication to another client server [\#493](https://github.com/feathersjs/authentication/issues/493) -- Unhandled Promise Rejection error. [\#489](https://github.com/feathersjs/authentication/issues/489) -- No Auth token on authentication resource [\#488](https://github.com/feathersjs/authentication/issues/488) -- How to verify JWT in feathers issued by another feathers instance ? [\#484](https://github.com/feathersjs/authentication/issues/484) -- hook.params.user [\#483](https://github.com/feathersjs/authentication/issues/483) -- Overriding JWT's expiresIn with a value more than 20d prevents users from signing in [\#458](https://github.com/feathersjs/authentication/issues/458) - -**Merged pull requests:** - -- Update feathers-socketio to the latest version 🚀 [\#503](https://github.com/feathersjs/authentication/pull/503) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update socket.io-client to the latest version 🚀 [\#501](https://github.com/feathersjs/authentication/pull/501) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Fix issue with very large token timeout. [\#499](https://github.com/feathersjs/authentication/pull/499) ([asdacap](https://github.com/asdacap)) -- Typo [\#492](https://github.com/feathersjs/authentication/pull/492) ([wdmtech](https://github.com/wdmtech)) -- Update migrating.md [\#490](https://github.com/feathersjs/authentication/pull/490) ([MichaelErmer](https://github.com/MichaelErmer)) -- Update semistandard to the latest version 🚀 [\#487](https://github.com/feathersjs/authentication/pull/487) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update feathers-hooks to the latest version 🚀 [\#485](https://github.com/feathersjs/authentication/pull/485) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update dependencies to enable Greenkeeper 🌴 [\#482](https://github.com/feathersjs/authentication/pull/482) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v1.2.2](https://github.com/feathersjs/authentication/tree/v1.2.2) (2017-04-12) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v1.2.1...v1.2.2) - -**Fixed bugs:** - -- accessToken not being used when provided by client over socketio [\#400](https://github.com/feathersjs/authentication/issues/400) - -**Closed issues:** - -- Incompatible old client dependency [\#479](https://github.com/feathersjs/authentication/issues/479) -- Using feathers-authentication-client for an existing API? [\#478](https://github.com/feathersjs/authentication/issues/478) -- app.authenticate error : UnhandledPromiseRejectionWarning: Unhandled promise rejection \(rejection id: 2\): \* Error \* [\#476](https://github.com/feathersjs/authentication/issues/476) -- Make `socket.feathers` data available in authentication hooks [\#475](https://github.com/feathersjs/authentication/issues/475) -- Allow the authenticate hook to be called with no parameters [\#473](https://github.com/feathersjs/authentication/issues/473) -- Authenticate : How to return more infos ? [\#471](https://github.com/feathersjs/authentication/issues/471) - -**Merged pull requests:** - -- Use latest version of feathers-authentication-client [\#480](https://github.com/feathersjs/authentication/pull/480) ([daffl](https://github.com/daffl)) -- Resolves \#475 - Socket params are made available to authentication hooks [\#477](https://github.com/feathersjs/authentication/pull/477) ([thomas-p-wilson](https://github.com/thomas-p-wilson)) - -## [v1.2.1](https://github.com/feathersjs/authentication/tree/v1.2.1) (2017-04-07) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v1.2.0...v1.2.1) - -**Fixed bugs:** - -- failureRedirect is never used when using with oauth2 [\#387](https://github.com/feathersjs/authentication/issues/387) - -**Closed issues:** - -- OAuth guides [\#470](https://github.com/feathersjs/authentication/issues/470) -- app.authenticate not working [\#466](https://github.com/feathersjs/authentication/issues/466) -- how can I logout using local authentication? [\#465](https://github.com/feathersjs/authentication/issues/465) -- How to do Socket.io Authentication [\#462](https://github.com/feathersjs/authentication/issues/462) -- Add event filtering by default \(socket.io\) [\#460](https://github.com/feathersjs/authentication/issues/460) -- Add ability to control if socket is marked as authenticated. [\#448](https://github.com/feathersjs/authentication/issues/448) -- Auth redirect issue [\#425](https://github.com/feathersjs/authentication/issues/425) -- E-mail verification step can be bypassed using Postman or Curl [\#391](https://github.com/feathersjs/authentication/issues/391) -- Example app [\#386](https://github.com/feathersjs/authentication/issues/386) - -**Merged pull requests:** - -- Allow the cookie to be set if action is not `remove` [\#474](https://github.com/feathersjs/authentication/pull/474) ([marshallswain](https://github.com/marshallswain)) - -## [v1.2.0](https://github.com/feathersjs/authentication/tree/v1.2.0) (2017-03-23) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v1.1.1...v1.2.0) - -**Fixed bugs:** - -- 1.0 authentication service hooks don't run when client uses feathers-socketio [\#455](https://github.com/feathersjs/authentication/issues/455) -- `hook.params.provider` is not set when calling `client.authenticate\(\)` [\#432](https://github.com/feathersjs/authentication/issues/432) -- remove method failed with JsonWebTokenError: invalid token [\#388](https://github.com/feathersjs/authentication/issues/388) - -**Closed issues:** - -- Token creation has side effect [\#454](https://github.com/feathersjs/authentication/issues/454) -- Question: When is userId set? [\#453](https://github.com/feathersjs/authentication/issues/453) -- How to authenticate SPA? More precisely how does the redirect works? [\#451](https://github.com/feathersjs/authentication/issues/451) -- POST to auth/facebook for FacebookTokenStrategy 404? [\#447](https://github.com/feathersjs/authentication/issues/447) -- feathers-authentication 1.1.1 `No auth token` [\#445](https://github.com/feathersjs/authentication/issues/445) -- Another readme incorrect and maybe docs to [\#441](https://github.com/feathersjs/authentication/issues/441) -- Readme incorrect and maybe docs to [\#440](https://github.com/feathersjs/authentication/issues/440) -- npm version issue? [\#439](https://github.com/feathersjs/authentication/issues/439) -- setCookie express middleware only works inside hooks [\#438](https://github.com/feathersjs/authentication/issues/438) -- createJWT throws 'secret must provided' [\#437](https://github.com/feathersjs/authentication/issues/437) -- Not useful error message on NotAuthenticated error [\#436](https://github.com/feathersjs/authentication/issues/436) -- Passwordfeld in auth.local does not work as expected [\#435](https://github.com/feathersjs/authentication/issues/435) -- Authentication via REST returns token without finding user on db [\#430](https://github.com/feathersjs/authentication/issues/430) - -**Merged pull requests:** - -- Filter out all events [\#461](https://github.com/feathersjs/authentication/pull/461) ([daffl](https://github.com/daffl)) -- Fix socket auth [\#459](https://github.com/feathersjs/authentication/pull/459) ([marshallswain](https://github.com/marshallswain)) -- Fix \#454 Token create has side effect [\#456](https://github.com/feathersjs/authentication/pull/456) ([whollacsek](https://github.com/whollacsek)) -- Windows compatible version of the original compile comand with public folder support. [\#442](https://github.com/feathersjs/authentication/pull/442) ([appurist](https://github.com/appurist)) -- Add client.js back for consistency [\#433](https://github.com/feathersjs/authentication/pull/433) ([daffl](https://github.com/daffl)) -- add string to authenticate \(typescript\) [\#431](https://github.com/feathersjs/authentication/pull/431) ([superbarne](https://github.com/superbarne)) -- Add support for Bearer scheme in remove method [\#403](https://github.com/feathersjs/authentication/pull/403) ([boybundit](https://github.com/boybundit)) - -## [v1.1.1](https://github.com/feathersjs/authentication/tree/v1.1.1) (2017-03-02) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v1.1.0...v1.1.1) - -**Closed issues:** - -- Authentication over socket.io never answers [\#428](https://github.com/feathersjs/authentication/issues/428) - -**Merged pull requests:** - -- Remove lots of hardcoded values for config, and adds the `authenticate` hook [\#427](https://github.com/feathersjs/authentication/pull/427) ([myknbani](https://github.com/myknbani)) - -## [v1.1.0](https://github.com/feathersjs/authentication/tree/v1.1.0) (2017-03-01) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v1.0.2...v1.1.0) - -**Fixed bugs:** - -- Mongo update error after logging into Facebook [\#244](https://github.com/feathersjs/authentication/issues/244) - -**Closed issues:** - -- Feature Request: Anonymous Authentication Strategy Support [\#423](https://github.com/feathersjs/authentication/issues/423) -- Error is not thrown if token that is provided is invalid [\#421](https://github.com/feathersjs/authentication/issues/421) -- Request body 'token' parameter disappears [\#420](https://github.com/feathersjs/authentication/issues/420) -- Auth2 issue getting JWT token from server when different ports [\#416](https://github.com/feathersjs/authentication/issues/416) -- Cookie-based authentication with XHR is not possible [\#413](https://github.com/feathersjs/authentication/issues/413) -- JWT Authentication setup failing [\#411](https://github.com/feathersjs/authentication/issues/411) -- how to disable service for external usage in version 1.0 [\#410](https://github.com/feathersjs/authentication/issues/410) -- v1.0 is removed from npm? [\#408](https://github.com/feathersjs/authentication/issues/408) -- Make JWT data more configurable [\#407](https://github.com/feathersjs/authentication/issues/407) -- Possible typo [\#406](https://github.com/feathersjs/authentication/issues/406) -- Authentication with an existing database with existing hashed \(md5\) passwords [\#398](https://github.com/feathersjs/authentication/issues/398) -- can modify selected fields only [\#397](https://github.com/feathersjs/authentication/issues/397) -- \[Discussion\] Migrating to 1.0 - hook changes [\#396](https://github.com/feathersjs/authentication/issues/396) -- feathers-authentication 'local' strategy requires token? [\#394](https://github.com/feathersjs/authentication/issues/394) -- JWT for local auth. [\#390](https://github.com/feathersjs/authentication/issues/390) -- Feathers 'Twitter API' style [\#385](https://github.com/feathersjs/authentication/issues/385) -- Missing code in example app [\#383](https://github.com/feathersjs/authentication/issues/383) -- feathers-authentication errors with any view error, and redirects to /auth/failure [\#381](https://github.com/feathersjs/authentication/issues/381) -- what does app.service\('authentication'\).remove\(...\) mean? [\#379](https://github.com/feathersjs/authentication/issues/379) -- Rest Endpoints. [\#375](https://github.com/feathersjs/authentication/issues/375) -- cordova google-plus signUp with id_token [\#373](https://github.com/feathersjs/authentication/issues/373) -- How to reconnect socket with cookie after page refresh ? [\#372](https://github.com/feathersjs/authentication/issues/372) -- Error: Could not find stored JWT and no authentication strategy was given [\#367](https://github.com/feathersjs/authentication/issues/367) -- "No auth token" using authenticate strategy: 'jwt' \(v.1.0.0-beta-2\) [\#366](https://github.com/feathersjs/authentication/issues/366) -- Navigating to /auth/\ twice redirects to /auth/failed [\#344](https://github.com/feathersjs/authentication/issues/344) -- Meteor auth migration guide [\#334](https://github.com/feathersjs/authentication/issues/334) -- Auth 1.0 [\#330](https://github.com/feathersjs/authentication/issues/330) -- RSA token secret [\#309](https://github.com/feathersjs/authentication/issues/309) -- Add option to use bcrypt [\#300](https://github.com/feathersjs/authentication/issues/300) -- Better example of how to change hashing algorithm? \[Question\] [\#289](https://github.com/feathersjs/authentication/issues/289) -- issuer doesn't work [\#284](https://github.com/feathersjs/authentication/issues/284) -- passport auth question [\#274](https://github.com/feathersjs/authentication/issues/274) -- Add support for authenticating active users only [\#259](https://github.com/feathersjs/authentication/issues/259) -- 404 response from populateUser\(\) hook [\#258](https://github.com/feathersjs/authentication/issues/258) -- Responses hang when token.secret is undefined for local authentication [\#249](https://github.com/feathersjs/authentication/issues/249) -- Authentication without password [\#246](https://github.com/feathersjs/authentication/issues/246) -- Fix successRedirect to not override cookie path [\#243](https://github.com/feathersjs/authentication/issues/243) -- Deprecate verifyToken and populateUser hooks in favour of middleware [\#227](https://github.com/feathersjs/authentication/issues/227) -- Authenticating and creating [\#100](https://github.com/feathersjs/authentication/issues/100) -- Add a password service [\#83](https://github.com/feathersjs/authentication/issues/83) - -**Merged pull requests:** - -- Fix JWT options typo [\#415](https://github.com/feathersjs/authentication/pull/415) ([daffl](https://github.com/daffl)) -- Prevent setCookie from mutating authOptions [\#414](https://github.com/feathersjs/authentication/pull/414) ([adrien-k](https://github.com/adrien-k)) -- Typescript Definitions [\#412](https://github.com/feathersjs/authentication/pull/412) ([AbraaoAlves](https://github.com/AbraaoAlves)) -- Docs for migrating to auth.hooks.authenticate hook [\#399](https://github.com/feathersjs/authentication/pull/399) ([petermikitsh](https://github.com/petermikitsh)) -- Typo 'cookie.enable' should be 'cookie.enabled' [\#380](https://github.com/feathersjs/authentication/pull/380) ([whollacsek](https://github.com/whollacsek)) -- Docs: Equalize usage of feathers-authenticate [\#378](https://github.com/feathersjs/authentication/pull/378) ([eikaramba](https://github.com/eikaramba)) - -## [v1.0.2](https://github.com/feathersjs/authentication/tree/v1.0.2) (2016-12-14) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v1.0.1...v1.0.2) - -**Closed issues:** - -- successRedirect not redirecting [\#364](https://github.com/feathersjs/authentication/issues/364) - -## [v1.0.1](https://github.com/feathersjs/authentication/tree/v1.0.1) (2016-12-14) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v1.0.0...v1.0.1) - -## [v1.0.0](https://github.com/feathersjs/authentication/tree/v1.0.0) (2016-12-14) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.7.12...v1.0.0) - -**Fixed bugs:** - -- restrictToOwner does not support multi patch, update and remove [\#228](https://github.com/feathersjs/authentication/issues/228) - -**Closed issues:** - -- auth.express.authenticate got undefined [\#363](https://github.com/feathersjs/authentication/issues/363) -- Non-standard header structure [\#361](https://github.com/feathersjs/authentication/issues/361) -- localEndpoint without local strategy [\#359](https://github.com/feathersjs/authentication/issues/359) -- Using custom passport strategies [\#356](https://github.com/feathersjs/authentication/issues/356) -- Client-side app.on\('login'\) [\#355](https://github.com/feathersjs/authentication/issues/355) -- Payload limiting on `app.get\('user'\)`? [\#354](https://github.com/feathersjs/authentication/issues/354) -- Authentication token is missing [\#352](https://github.com/feathersjs/authentication/issues/352) -- \[1.0\] The entity on the socket should pull from the strategy options. [\#348](https://github.com/feathersjs/authentication/issues/348) -- \[1.0\] Only the first failure is returned on auth failure when chaining multiple strategies [\#346](https://github.com/feathersjs/authentication/issues/346) -- Build 0.7.11 does not contain current code on NPMJS [\#342](https://github.com/feathersjs/authentication/issues/342) -- feathers-authentication branch 0.8 did not work with payload \(tested on socket\) [\#264](https://github.com/feathersjs/authentication/issues/264) -- Add method for updating JWT [\#260](https://github.com/feathersjs/authentication/issues/260) -- 1.0 architecture considerations [\#226](https://github.com/feathersjs/authentication/issues/226) -- Features/RFC [\#213](https://github.com/feathersjs/authentication/issues/213) -- Support access_token based OAuth2 providers [\#169](https://github.com/feathersjs/authentication/issues/169) -- Support openID [\#154](https://github.com/feathersjs/authentication/issues/154) -- Disable cookie by default if not using OAuth [\#152](https://github.com/feathersjs/authentication/issues/152) -- Add token service tests [\#144](https://github.com/feathersjs/authentication/issues/144) -- Add local service tests [\#143](https://github.com/feathersjs/authentication/issues/143) -- Add OAuth2 service tests [\#142](https://github.com/feathersjs/authentication/issues/142) -- Add OAuth2 integration tests [\#141](https://github.com/feathersjs/authentication/issues/141) -- Add integration tests for custom redirects [\#125](https://github.com/feathersjs/authentication/issues/125) -- Support mobile authentication via OAuth1 [\#47](https://github.com/feathersjs/authentication/issues/47) -- Support OAuth1 [\#42](https://github.com/feathersjs/authentication/issues/42) -- Password-less Local Auth with Email / SMS [\#7](https://github.com/feathersjs/authentication/issues/7) - -**Merged pull requests:** - -- migrating to semistandard [\#371](https://github.com/feathersjs/authentication/pull/371) ([ekryski](https://github.com/ekryski)) -- Logout should always give a response. [\#369](https://github.com/feathersjs/authentication/pull/369) ([marshallswain](https://github.com/marshallswain)) -- Clarify that the authenticate hook is required. [\#368](https://github.com/feathersjs/authentication/pull/368) ([marshallswain](https://github.com/marshallswain)) -- Fix README example [\#365](https://github.com/feathersjs/authentication/pull/365) ([saiberz](https://github.com/saiberz)) -- Remove additional deprecation notice [\#362](https://github.com/feathersjs/authentication/pull/362) ([porsager](https://github.com/porsager)) -- fix typo [\#360](https://github.com/feathersjs/authentication/pull/360) ([osenvosem](https://github.com/osenvosem)) -- Update feathers-primus to version 2.0.0 🚀 [\#358](https://github.com/feathersjs/authentication/pull/358) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Create .codeclimate.yml [\#357](https://github.com/feathersjs/authentication/pull/357) ([larkinscott](https://github.com/larkinscott)) -- fixing redirect middleware [\#353](https://github.com/feathersjs/authentication/pull/353) ([ekryski](https://github.com/ekryski)) -- Remove useless quotes [\#351](https://github.com/feathersjs/authentication/pull/351) ([bertho-zero](https://github.com/bertho-zero)) -- A bunch of bug fixes [\#349](https://github.com/feathersjs/authentication/pull/349) ([ekryski](https://github.com/ekryski)) -- fix\(docs/new-features\): syntax highlighting [\#347](https://github.com/feathersjs/authentication/pull/347) ([justingreenberg](https://github.com/justingreenberg)) -- Update superagent to version 3.0.0 🚀 [\#345](https://github.com/feathersjs/authentication/pull/345) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Update feathers-memory to version 1.0.0 🚀 [\#343](https://github.com/feathersjs/authentication/pull/343) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- 1.0 Pre-release [\#336](https://github.com/feathersjs/authentication/pull/336) ([ekryski](https://github.com/ekryski)) - -## [v0.7.12](https://github.com/feathersjs/authentication/tree/v0.7.12) (2016-11-11) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.7.11...v0.7.12) - -**Closed issues:** - -- App.authenticate uses wrong `this` reference [\#341](https://github.com/feathersjs/authentication/issues/341) -- Getting more done in GitHub with ZenHub [\#331](https://github.com/feathersjs/authentication/issues/331) -- Need help to use feathers authentication storage in vue vuex [\#329](https://github.com/feathersjs/authentication/issues/329) -- How to get user id in hooks? [\#322](https://github.com/feathersjs/authentication/issues/322) -- I checked out my new feathersjs app in another machine, created a new user but I can't log in! [\#320](https://github.com/feathersjs/authentication/issues/320) -- restrict-to-owner throws error when user id is 0 [\#319](https://github.com/feathersjs/authentication/issues/319) -- Not providing sufficient details for an auth provider should not be an error. [\#318](https://github.com/feathersjs/authentication/issues/318) -- \[Question\] Is there a way to verify a user with password? [\#316](https://github.com/feathersjs/authentication/issues/316) -- 0.8.0 beta 1 bug - this is not defined [\#315](https://github.com/feathersjs/authentication/issues/315) -- Client: Document getJWT & verifyJWT [\#313](https://github.com/feathersjs/authentication/issues/313) -- Socket client should automatically auth on reconnect [\#310](https://github.com/feathersjs/authentication/issues/310) -- app.get\('token'\) doesn't work after a browser refresh. [\#303](https://github.com/feathersjs/authentication/issues/303) -- Problem issuing multiple jwt's for the same user [\#302](https://github.com/feathersjs/authentication/issues/302) -- restrict-to-owner does not allow Service.remove\(null\) from internal systems [\#301](https://github.com/feathersjs/authentication/issues/301) -- How to migrate from restrictToOwner to checkPermissions [\#299](https://github.com/feathersjs/authentication/issues/299) -- "username" cannot be used as local strategy usernameField [\#294](https://github.com/feathersjs/authentication/issues/294) -- Bad Hook API Design: Hooks are inconsistent and impure functions [\#288](https://github.com/feathersjs/authentication/issues/288) -- Mutliple 'user' models for authentication [\#282](https://github.com/feathersjs/authentication/issues/282) -- Client should ensure socket.io upgrade is complete before authenticating [\#275](https://github.com/feathersjs/authentication/issues/275) -- JWT is not sent after socket reconnection [\#272](https://github.com/feathersjs/authentication/issues/272) -- 401 after service is moved/refactored [\#270](https://github.com/feathersjs/authentication/issues/270) -- Client side auth should subscribe to user updates so that app.get\('user'\) is fresh [\#195](https://github.com/feathersjs/authentication/issues/195) -- Make oauth2 more general [\#179](https://github.com/feathersjs/authentication/issues/179) -- Add integration tests for custom service endpoints [\#145](https://github.com/feathersjs/authentication/issues/145) -- Create a `requireAuth` wrapper for `verifyToken`, `populateUser`, `restrictToAuth` [\#118](https://github.com/feathersjs/authentication/issues/118) - -**Merged pull requests:** - -- babel-core@6.18.2 breaks build 🚨 [\#339](https://github.com/feathersjs/authentication/pull/339) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- 👻😱 Node.js 0.10 is unmaintained 😱👻 [\#337](https://github.com/feathersjs/authentication/pull/337) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- restrictToOwner -Fix check for methodNotAllowed [\#335](https://github.com/feathersjs/authentication/pull/335) ([daffl](https://github.com/daffl)) -- Implement login and logout events for REST authentication [\#325](https://github.com/feathersjs/authentication/pull/325) ([daffl](https://github.com/daffl)) -- Socket.io authentication tests and login logout event [\#324](https://github.com/feathersjs/authentication/pull/324) ([daffl](https://github.com/daffl)) -- Reorganization [\#321](https://github.com/feathersjs/authentication/pull/321) ([ekryski](https://github.com/ekryski)) -- client: use Authentication class, make `getJWT` and `verifyJWT` async [\#317](https://github.com/feathersjs/authentication/pull/317) ([marshallswain](https://github.com/marshallswain)) -- 0.8 client decode jwt [\#314](https://github.com/feathersjs/authentication/pull/314) ([marshallswain](https://github.com/marshallswain)) -- Store config at `app.config` [\#312](https://github.com/feathersjs/authentication/pull/312) ([marshallswain](https://github.com/marshallswain)) -- Cookies will match jwt expiry by default. [\#308](https://github.com/feathersjs/authentication/pull/308) ([marshallswain](https://github.com/marshallswain)) -- Remove permissions hooks and middleware [\#307](https://github.com/feathersjs/authentication/pull/307) ([daffl](https://github.com/daffl)) -- First cut for authentication middleware [\#305](https://github.com/feathersjs/authentication/pull/305) ([daffl](https://github.com/daffl)) -- 0.8 - OAuth fixes [\#304](https://github.com/feathersjs/authentication/pull/304) ([marshallswain](https://github.com/marshallswain)) - -## [v0.7.11](https://github.com/feathersjs/authentication/tree/v0.7.11) (2016-09-28) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.7.10...v0.7.11) - -**Closed issues:** - -- Unable to authenticate with passport-google-oauth20 [\#295](https://github.com/feathersjs/authentication/issues/295) -- "Unauthorized" Response with Hook Data [\#291](https://github.com/feathersjs/authentication/issues/291) -- hashPassword in patch [\#286](https://github.com/feathersjs/authentication/issues/286) -- Mobile App Facebook Login [\#276](https://github.com/feathersjs/authentication/issues/276) -- Socket user should update automatically [\#266](https://github.com/feathersjs/authentication/issues/266) -- Get user outside a service [\#261](https://github.com/feathersjs/authentication/issues/261) - -**Merged pull requests:** - -- hashPassword fall-through if there's no password [\#287](https://github.com/feathersjs/authentication/pull/287) ([marshallswain](https://github.com/marshallswain)) -- Update feathers-memory to version 0.8.0 🚀 [\#285](https://github.com/feathersjs/authentication/pull/285) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Allow multiple username fields for local auth [\#283](https://github.com/feathersjs/authentication/pull/283) ([sdbondi](https://github.com/sdbondi)) - -## [v0.7.10](https://github.com/feathersjs/authentication/tree/v0.7.10) (2016-08-31) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.7.9...v0.7.10) - -**Fixed bugs:** - -- restrictToOwner should not throw an error on mass deletions [\#175](https://github.com/feathersjs/authentication/issues/175) - -**Closed issues:** - -- Duplicate Email should be rejected by Default [\#281](https://github.com/feathersjs/authentication/issues/281) -- Auth0 & featherjs authorization only [\#277](https://github.com/feathersjs/authentication/issues/277) -- Cannot read property 'scope' of undefined [\#273](https://github.com/feathersjs/authentication/issues/273) -- Socker.js | Custom successHandler [\#271](https://github.com/feathersjs/authentication/issues/271) -- Use feathers-socketio? and rest&socket share session maybe? [\#269](https://github.com/feathersjs/authentication/issues/269) -- Ability to invalidate old token/session when user login with another machine. [\#267](https://github.com/feathersjs/authentication/issues/267) -- 0.8 authentication before hooks - only ever getting a 401 Unauthorised [\#263](https://github.com/feathersjs/authentication/issues/263) -- REST Middleware breaks local auth [\#262](https://github.com/feathersjs/authentication/issues/262) -- 0.8: Token Service errors on token auth using client [\#254](https://github.com/feathersjs/authentication/issues/254) -- 0.8: Cookies, turning off feathers-session cookie also turns off feathers-jwt cookie. [\#253](https://github.com/feathersjs/authentication/issues/253) -- Any example of how to do refresh token? [\#248](https://github.com/feathersjs/authentication/issues/248) -- Custom Authentication Hooks [\#236](https://github.com/feathersjs/authentication/issues/236) -- Is there an Authenticated Event [\#235](https://github.com/feathersjs/authentication/issues/235) -- Error while using /auth/local [\#233](https://github.com/feathersjs/authentication/issues/233) -- Providing token to feathers.authentication doesn't work [\#230](https://github.com/feathersjs/authentication/issues/230) -- bundled hooks customize errors [\#215](https://github.com/feathersjs/authentication/issues/215) -- Hooks should support a callback for conditionally running [\#210](https://github.com/feathersjs/authentication/issues/210) -- restrictToRoles hook: More complex determination of "owner". [\#205](https://github.com/feathersjs/authentication/issues/205) -- verifyToken hook option to error [\#200](https://github.com/feathersjs/authentication/issues/200) -- Allow using restrictToOwner as an after hook [\#123](https://github.com/feathersjs/authentication/issues/123) - -**Merged pull requests:** - -- Manually supply an endpoint to the Client authenticate\(\) method [\#278](https://github.com/feathersjs/authentication/pull/278) ([mcnamee](https://github.com/mcnamee)) -- Update mocha to version 3.0.0 🚀 [\#257](https://github.com/feathersjs/authentication/pull/257) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Don’t mix options when signing tokens [\#255](https://github.com/feathersjs/authentication/pull/255) ([marshallswain](https://github.com/marshallswain)) -- Attempt to get token right away. [\#252](https://github.com/feathersjs/authentication/pull/252) ([marshallswain](https://github.com/marshallswain)) -- Update async to version 2.0.0 🚀 [\#240](https://github.com/feathersjs/authentication/pull/240) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Creates better way or returning data in a familiar format [\#234](https://github.com/feathersjs/authentication/pull/234) ([codingfriend1](https://github.com/codingfriend1)) -- Throws an error if restriction methods are used outside of a find or get hook [\#232](https://github.com/feathersjs/authentication/pull/232) ([codingfriend1](https://github.com/codingfriend1)) -- RestrictToOwner now takes an array [\#231](https://github.com/feathersjs/authentication/pull/231) ([sscaff1](https://github.com/sscaff1)) -- Adds ability to limit queries unless authenticated and authorized [\#229](https://github.com/feathersjs/authentication/pull/229) ([codingfriend1](https://github.com/codingfriend1)) - -## [v0.7.9](https://github.com/feathersjs/authentication/tree/v0.7.9) (2016-06-20) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.7.8...v0.7.9) - -**Fixed bugs:** - -- Calling logout should revoke/blacklist a JWT [\#133](https://github.com/feathersjs/authentication/issues/133) - -**Closed issues:** - -- Query email rather than oauth provider id on /auth/\ [\#223](https://github.com/feathersjs/authentication/issues/223) -- Cannot read property \'service\' of undefined [\#222](https://github.com/feathersjs/authentication/issues/222) - -**Merged pull requests:** - -- added support for hashing passwords when hook.data is an array [\#225](https://github.com/feathersjs/authentication/pull/225) ([eblin](https://github.com/eblin)) -- jwt ssl warning [\#214](https://github.com/feathersjs/authentication/pull/214) ([aboutlo](https://github.com/aboutlo)) - -## [v0.7.8](https://github.com/feathersjs/authentication/tree/v0.7.8) (2016-06-09) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.7.7...v0.7.8) - -**Closed issues:** - -- Feathers-authentication assumptions [\#220](https://github.com/feathersjs/authentication/issues/220) -- Server-side header option does not accept capital letters [\#218](https://github.com/feathersjs/authentication/issues/218) -- How to figure out why redirect to /auth/failure? [\#217](https://github.com/feathersjs/authentication/issues/217) -- Getting token via REST is not documented [\#216](https://github.com/feathersjs/authentication/issues/216) -- How to use Feathers Client to Authenticate Facebook/Instagram credentials [\#204](https://github.com/feathersjs/authentication/issues/204) -- Remove token from localstorage [\#203](https://github.com/feathersjs/authentication/issues/203) -- Check user password [\#193](https://github.com/feathersjs/authentication/issues/193) -- app.authenticate\(\): Warning: a promise was rejected with a non-error: \[object Object\] [\#191](https://github.com/feathersjs/authentication/issues/191) -- Authentication provider for Facebook Account Kit [\#189](https://github.com/feathersjs/authentication/issues/189) - -**Merged pull requests:** - -- Lowercase custom header [\#219](https://github.com/feathersjs/authentication/pull/219) ([mmwtsn](https://github.com/mmwtsn)) -- mocha@2.5.0 breaks build 🚨 [\#212](https://github.com/feathersjs/authentication/pull/212) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Small refactoring to simplify structure and remove code duplication [\#209](https://github.com/feathersjs/authentication/pull/209) ([daffl](https://github.com/daffl)) -- Use removeItem in the storage on logout [\#208](https://github.com/feathersjs/authentication/pull/208) ([daffl](https://github.com/daffl)) -- Misspelled in a comment [\#201](https://github.com/feathersjs/authentication/pull/201) ([tryy3](https://github.com/tryy3)) -- Update babel-plugin-add-module-exports to version 0.2.0 🚀 [\#199](https://github.com/feathersjs/authentication/pull/199) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) - -## [v0.7.7](https://github.com/feathersjs/authentication/tree/v0.7.7) (2016-05-05) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.7.6...v0.7.7) - -**Fixed bugs:** - -- OAuth2 authentication callback failing due to missing property [\#196](https://github.com/feathersjs/authentication/issues/196) - -**Merged pull requests:** - -- properly handle optional `\_json` property [\#197](https://github.com/feathersjs/authentication/pull/197) ([nyaaao](https://github.com/nyaaao)) - -## [v0.7.6](https://github.com/feathersjs/authentication/tree/v0.7.6) (2016-05-03) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.7.5...v0.7.6) - -**Fixed bugs:** - -- Facebook Authentication should do a patch not an update. [\#174](https://github.com/feathersjs/authentication/issues/174) - -**Closed issues:** - -- Authenticated user [\#192](https://github.com/feathersjs/authentication/issues/192) -- REST token revoke [\#185](https://github.com/feathersjs/authentication/issues/185) -- TypeError: Cannot read property 'service' of undefined [\#173](https://github.com/feathersjs/authentication/issues/173) -- Optionally Include password in the params.query object passed to User.find\(\) [\#171](https://github.com/feathersjs/authentication/issues/171) -- Pass more to local authentication params [\#165](https://github.com/feathersjs/authentication/issues/165) -- Support custom authentication strategies [\#157](https://github.com/feathersjs/authentication/issues/157) - -**Merged pull requests:** - -- Allow manipulation of params before checking credentials [\#186](https://github.com/feathersjs/authentication/pull/186) ([saiichihashimoto](https://github.com/saiichihashimoto)) -- Update feathers to version 2.0.1 🚀 [\#184](https://github.com/feathersjs/authentication/pull/184) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- fix\(oauth2\): Use patch to update user in oauthCallback [\#183](https://github.com/feathersjs/authentication/pull/183) ([beevelop](https://github.com/beevelop)) - -## [v0.7.5](https://github.com/feathersjs/authentication/tree/v0.7.5) (2016-04-23) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.7.4...v0.7.5) - -**Fixed bugs:** - -- restrictToOwner and restrictToRoles have invalid type checking [\#172](https://github.com/feathersjs/authentication/issues/172) - -**Closed issues:** - -- user fails to signup with facebook if there is also local auth [\#168](https://github.com/feathersjs/authentication/issues/168) -- Unable to authenticate requests when using vanilla Socket.IO [\#166](https://github.com/feathersjs/authentication/issues/166) - -## [v0.7.4](https://github.com/feathersjs/authentication/tree/v0.7.4) (2016-04-18) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.7.3...v0.7.4) - -**Fixed bugs:** - -- restrictToOwner and restrictToRoles hooks don't work with nested models [\#163](https://github.com/feathersjs/authentication/issues/163) -- Change restrictToOwner error when a request does not contain ID [\#160](https://github.com/feathersjs/authentication/issues/160) - -**Closed issues:** - -- authenticate\(\) can leak sensetive user data via token service [\#162](https://github.com/feathersjs/authentication/issues/162) -- onBeforeLogin Hook [\#161](https://github.com/feathersjs/authentication/issues/161) - -**Merged pull requests:** - -- Hook fixes [\#164](https://github.com/feathersjs/authentication/pull/164) ([ekryski](https://github.com/ekryski)) - -## [v0.7.3](https://github.com/feathersjs/authentication/tree/v0.7.3) (2016-04-16) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.7.2...v0.7.3) - -## [v0.7.2](https://github.com/feathersjs/authentication/tree/v0.7.2) (2016-04-16) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.7.1...v0.7.2) - -**Closed issues:** - -- Auth doesn't work with non default local.userEndpoint [\#159](https://github.com/feathersjs/authentication/issues/159) -- Automatically add the hashPassword hook to local.userEndpoint [\#158](https://github.com/feathersjs/authentication/issues/158) -- Client authentication\(\) storage option not documented [\#155](https://github.com/feathersjs/authentication/issues/155) -- restrictToRoles availability inconsistency [\#153](https://github.com/feathersjs/authentication/issues/153) -- Does not populate user for other services [\#150](https://github.com/feathersjs/authentication/issues/150) - -**Merged pull requests:** - -- Steal Compatibility [\#156](https://github.com/feathersjs/authentication/pull/156) ([marshallswain](https://github.com/marshallswain)) - -## [v0.7.1](https://github.com/feathersjs/authentication/tree/v0.7.1) (2016-04-08) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.7.0...v0.7.1) - -**Closed issues:** - -- Documentation discrepancies [\#148](https://github.com/feathersjs/authentication/issues/148) -- bcrypt is hardcoded [\#146](https://github.com/feathersjs/authentication/issues/146) -- Update Docs, Guides, Examples for v0.7 [\#129](https://github.com/feathersjs/authentication/issues/129) -- populateUser: allow option to populate without db call. [\#92](https://github.com/feathersjs/authentication/issues/92) - -**Merged pull requests:** - -- Update feathers-memory to version 0.7.0 🚀 [\#149](https://github.com/feathersjs/authentication/pull/149) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- fix a typo [\#147](https://github.com/feathersjs/authentication/pull/147) ([chrjean](https://github.com/chrjean)) -- Fix copy paste typo in queryWithCurrentUser hook. [\#140](https://github.com/feathersjs/authentication/pull/140) ([juodumas](https://github.com/juodumas)) - -## [v0.7.0](https://github.com/feathersjs/authentication/tree/v0.7.0) (2016-03-30) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.6.0...v0.7.0) - -**Fixed bugs:** - -- logout should de-authenticate a socket [\#136](https://github.com/feathersjs/authentication/issues/136) -- \[Security\] JsonWebToken Lifecycle Concerns; Set HttpOnly = true in JWT cookie [\#132](https://github.com/feathersjs/authentication/issues/132) -- restrictToRoles hook needs to throw an error and not scope the query [\#128](https://github.com/feathersjs/authentication/issues/128) -- restrictToOwner hook needs to throw an error and not scope the query [\#127](https://github.com/feathersjs/authentication/issues/127) -- \[security\] Generated tokens are broadcast to all socket clients \(by default\) [\#126](https://github.com/feathersjs/authentication/issues/126) -- \[oAuth\] User profile should be updated every time they are authenticated [\#124](https://github.com/feathersjs/authentication/issues/124) -- Logout should clear the cookie [\#122](https://github.com/feathersjs/authentication/issues/122) -- Want the default success/fail routes, not the sendFile [\#121](https://github.com/feathersjs/authentication/issues/121) - -**Closed issues:** - -- Make all hooks optional if used internally [\#138](https://github.com/feathersjs/authentication/issues/138) -- Throw errors for deprecated hooks and update documentation [\#134](https://github.com/feathersjs/authentication/issues/134) -- v6.0.0: How can I return the user object along with the token ? [\#131](https://github.com/feathersjs/authentication/issues/131) -- user field not getting populated [\#119](https://github.com/feathersjs/authentication/issues/119) -- Move to bcryptjs [\#112](https://github.com/feathersjs/authentication/issues/112) -- Bundled hooks should pull from auth config to avoid having to pass duplicate props. [\#93](https://github.com/feathersjs/authentication/issues/93) -- Customize the JWT payload [\#78](https://github.com/feathersjs/authentication/issues/78) -- Needs a test for verifying that a custom tokenEndpoint works. [\#59](https://github.com/feathersjs/authentication/issues/59) -- Finish test coverage for existing features. [\#9](https://github.com/feathersjs/authentication/issues/9) - -**Merged pull requests:** - -- 0.7 Release [\#139](https://github.com/feathersjs/authentication/pull/139) ([ekryski](https://github.com/ekryski)) - -## [v0.6.0](https://github.com/feathersjs/authentication/tree/v0.6.0) (2016-03-24) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.5.1...v0.6.0) - -**Fixed bugs:** - -- Token encoding is not using the idField option. [\#107](https://github.com/feathersjs/authentication/issues/107) -- Logging out breaks in React Native [\#105](https://github.com/feathersjs/authentication/issues/105) -- Updating User Attached to Params in Client [\#102](https://github.com/feathersjs/authentication/issues/102) -- local auth should not redirect by default [\#89](https://github.com/feathersjs/authentication/issues/89) - -**Closed issues:** - -- Id of user can't be 0 for auth [\#116](https://github.com/feathersjs/authentication/issues/116) -- how to authenticate user in the socket.io? [\#111](https://github.com/feathersjs/authentication/issues/111) -- Wrong Status Error [\#110](https://github.com/feathersjs/authentication/issues/110) -- TypeError: Cannot read property 'service' of undefined \(continued\) [\#108](https://github.com/feathersjs/authentication/issues/108) -- `idField` breaks from `tokenService.create\(\)` to `populateUser\(\)` after hook [\#103](https://github.com/feathersjs/authentication/issues/103) - -**Merged pull requests:** - -- Bcryptjs [\#137](https://github.com/feathersjs/authentication/pull/137) ([ekryski](https://github.com/ekryski)) -- Allow user.id to be 0. Fixes \#116 [\#117](https://github.com/feathersjs/authentication/pull/117) ([marshallswain](https://github.com/marshallswain)) -- client should return a 401 error code when no token is provided [\#115](https://github.com/feathersjs/authentication/pull/115) ([ccummings](https://github.com/ccummings)) -- v0.6 - Bugs fixes, new hooks, and hook tests [\#109](https://github.com/feathersjs/authentication/pull/109) ([ekryski](https://github.com/ekryski)) -- primus client connect event is 'open' [\#106](https://github.com/feathersjs/authentication/pull/106) ([ahdinosaur](https://github.com/ahdinosaur)) - -## [v0.5.1](https://github.com/feathersjs/authentication/tree/v0.5.1) (2016-03-15) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.5.0...v0.5.1) - -## [v0.5.0](https://github.com/feathersjs/authentication/tree/v0.5.0) (2016-03-14) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.4.1...v0.5.0) - -**Fixed bugs:** - -- Client should store token string and not the token object [\#95](https://github.com/feathersjs/authentication/issues/95) - -**Closed issues:** - -- using feathers-rest/client with feathers-authentication/client [\#94](https://github.com/feathersjs/authentication/issues/94) -- populateUser can pull defaults from config, if available. [\#91](https://github.com/feathersjs/authentication/issues/91) -- App level auth routes for multiple sub-routes [\#90](https://github.com/feathersjs/authentication/issues/90) -- POST to /auth/local never gets response [\#88](https://github.com/feathersjs/authentication/issues/88) -- populate-user.js do not get settings [\#86](https://github.com/feathersjs/authentication/issues/86) -- Add rate limiting [\#81](https://github.com/feathersjs/authentication/issues/81) - -**Merged pull requests:** - -- Finalizing client side authentication module [\#101](https://github.com/feathersjs/authentication/pull/101) ([daffl](https://github.com/daffl)) -- Ten hours is only 36 seconds [\#99](https://github.com/feathersjs/authentication/pull/99) ([mileswilson](https://github.com/mileswilson)) -- Fix examples [\#98](https://github.com/feathersjs/authentication/pull/98) ([mastertinner](https://github.com/mastertinner)) -- fix html in templates [\#97](https://github.com/feathersjs/authentication/pull/97) ([mastertinner](https://github.com/mastertinner)) -- update populateUser\(\) hook [\#87](https://github.com/feathersjs/authentication/pull/87) ([kulakowka](https://github.com/kulakowka)) -- Customize the JWT payload [\#80](https://github.com/feathersjs/authentication/pull/80) ([enten](https://github.com/enten)) - -## [v0.4.1](https://github.com/feathersjs/authentication/tree/v0.4.1) (2016-02-28) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.4.0...v0.4.1) - -**Fixed bugs:** - -- app.logout\(\) fails [\#85](https://github.com/feathersjs/authentication/issues/85) - -**Closed issues:** - -- Username response ? [\#84](https://github.com/feathersjs/authentication/issues/84) -- User doesn't get populated after authentication with databases that don't use \_id [\#71](https://github.com/feathersjs/authentication/issues/71) -- Support client usage in NodeJS [\#52](https://github.com/feathersjs/authentication/issues/52) -- Support async storage for React Native [\#51](https://github.com/feathersjs/authentication/issues/51) -- RequireAdmin on userService [\#36](https://github.com/feathersjs/authentication/issues/36) -- Create test for changing the `usernameField` [\#1](https://github.com/feathersjs/authentication/issues/1) - -## [v0.4.0](https://github.com/feathersjs/authentication/tree/v0.4.0) (2016-02-27) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.3.5...v0.4.0) - -**Closed issues:** - -- Authentication not worked with hooks.remove\('password'\) [\#82](https://github.com/feathersjs/authentication/issues/82) - -**Merged pull requests:** - -- Refactoring for storage service [\#76](https://github.com/feathersjs/authentication/pull/76) ([ekryski](https://github.com/ekryski)) - -## [v0.3.5](https://github.com/feathersjs/authentication/tree/v0.3.5) (2016-02-25) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.3.4...v0.3.5) - -**Merged pull requests:** - -- Adding support for OAuth2 token based auth strategies. Closes \#46. [\#77](https://github.com/feathersjs/authentication/pull/77) ([ekryski](https://github.com/ekryski)) - -## [v0.3.4](https://github.com/feathersjs/authentication/tree/v0.3.4) (2016-02-25) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.3.3...v0.3.4) - -## [v0.3.3](https://github.com/feathersjs/authentication/tree/v0.3.3) (2016-02-25) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.3.2...v0.3.3) - -## [v0.3.2](https://github.com/feathersjs/authentication/tree/v0.3.2) (2016-02-24) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.3.1...v0.3.2) - -**Merged pull requests:** - -- bumping feathers-errors version [\#79](https://github.com/feathersjs/authentication/pull/79) ([ekryski](https://github.com/ekryski)) - -## [v0.3.1](https://github.com/feathersjs/authentication/tree/v0.3.1) (2016-02-23) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.3.0...v0.3.1) - -**Closed issues:** - -- Fix toLowerCase hook [\#74](https://github.com/feathersjs/authentication/issues/74) -- REST auth/local not working if socketio\(\) not set [\#72](https://github.com/feathersjs/authentication/issues/72) -- Support mobile authentication via OAuth2 [\#46](https://github.com/feathersjs/authentication/issues/46) - -**Merged pull requests:** - -- Fix toLowerCase hook [\#75](https://github.com/feathersjs/authentication/pull/75) ([enten](https://github.com/enten)) - -## [v0.3.0](https://github.com/feathersjs/authentication/tree/v0.3.0) (2016-02-19) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.2.4...v0.3.0) - -**Fixed bugs:** - -- Don't register successRedirect route if custom one is passed in [\#61](https://github.com/feathersjs/authentication/issues/61) - -**Closed issues:** - -- Specify the secret in one place instead of two [\#69](https://github.com/feathersjs/authentication/issues/69) -- support a failRedirect [\#62](https://github.com/feathersjs/authentication/issues/62) -- Document authentication updates [\#50](https://github.com/feathersjs/authentication/issues/50) - -**Merged pull requests:** - -- Config options [\#70](https://github.com/feathersjs/authentication/pull/70) ([ekryski](https://github.com/ekryski)) - -## [v0.2.4](https://github.com/feathersjs/authentication/tree/v0.2.4) (2016-02-17) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.2.3...v0.2.4) - -**Closed issues:** - -- Find "query" is replaced by token [\#64](https://github.com/feathersjs/authentication/issues/64) - -**Merged pull requests:** - -- Add module exports Babel module and test CommonJS compatibility [\#68](https://github.com/feathersjs/authentication/pull/68) ([daffl](https://github.com/daffl)) - -## [v0.2.3](https://github.com/feathersjs/authentication/tree/v0.2.3) (2016-02-15) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.2.2...v0.2.3) - -**Closed issues:** - -- How to forbid get and find on the userEndpoint? [\#66](https://github.com/feathersjs/authentication/issues/66) -- userEndpoint problem in sub-app [\#63](https://github.com/feathersjs/authentication/issues/63) -- How to modify successRedirect in local authentication? [\#60](https://github.com/feathersjs/authentication/issues/60) - -**Merged pull requests:** - -- Removing assigning token to params.query for sockets. [\#67](https://github.com/feathersjs/authentication/pull/67) ([ekryski](https://github.com/ekryski)) -- Fixing client query [\#65](https://github.com/feathersjs/authentication/pull/65) ([fastlorenzo](https://github.com/fastlorenzo)) - -## [v0.2.2](https://github.com/feathersjs/authentication/tree/v0.2.2) (2016-02-13) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.2.1...v0.2.2) - -**Closed issues:** - -- Custom tokenEndpoint failing [\#57](https://github.com/feathersjs/authentication/issues/57) -- TypeError: Cannot read property 'service' of undefined [\#56](https://github.com/feathersjs/authentication/issues/56) -- Login returns 500: Internal server error [\#54](https://github.com/feathersjs/authentication/issues/54) - -**Merged pull requests:** - -- Fixing token endpoint [\#58](https://github.com/feathersjs/authentication/pull/58) ([marshallswain](https://github.com/marshallswain)) - -## [v0.2.1](https://github.com/feathersjs/authentication/tree/v0.2.1) (2016-02-12) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.2.0...v0.2.1) - -**Closed issues:** - -- Custom local options not being respected. [\#55](https://github.com/feathersjs/authentication/issues/55) -- node can not require\("feathers-authentication"\).default [\#53](https://github.com/feathersjs/authentication/issues/53) - -## [v0.2.0](https://github.com/feathersjs/authentication/tree/v0.2.0) (2016-02-12) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.1.2...v0.2.0) - -**Closed issues:** - -- Support graceful fallback to cookies [\#45](https://github.com/feathersjs/authentication/issues/45) -- Add a client side component for authentication [\#44](https://github.com/feathersjs/authentication/issues/44) -- Support OAuth2 [\#43](https://github.com/feathersjs/authentication/issues/43) -- Support token based authentication [\#41](https://github.com/feathersjs/authentication/issues/41) -- Support local authentication [\#40](https://github.com/feathersjs/authentication/issues/40) -- Only sign the JWT with user id. Not the whole user object [\#38](https://github.com/feathersjs/authentication/issues/38) -- Discussion: Securing token for socket.io auth [\#33](https://github.com/feathersjs/authentication/issues/33) -- Handling expired tokens [\#25](https://github.com/feathersjs/authentication/issues/25) -- Support multiple auth providers [\#6](https://github.com/feathersjs/authentication/issues/6) - -**Merged pull requests:** - -- Decoupling [\#49](https://github.com/feathersjs/authentication/pull/49) ([ekryski](https://github.com/ekryski)) -- Adding an auth client [\#48](https://github.com/feathersjs/authentication/pull/48) ([ekryski](https://github.com/ekryski)) -- Validate if provider [\#39](https://github.com/feathersjs/authentication/pull/39) ([mastertinner](https://github.com/mastertinner)) - -## [v0.1.2](https://github.com/feathersjs/authentication/tree/v0.1.2) (2016-02-04) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.1.1...v0.1.2) - -**Closed issues:** - -- Hooks should support incoming data as arrays of objects. [\#34](https://github.com/feathersjs/authentication/issues/34) -- Support authenticating with Username and Password via sockets [\#32](https://github.com/feathersjs/authentication/issues/32) - -**Merged pull requests:** - -- Check for params.provider in requireAuth hook [\#37](https://github.com/feathersjs/authentication/pull/37) ([marshallswain](https://github.com/marshallswain)) -- safety check for data [\#35](https://github.com/feathersjs/authentication/pull/35) ([deanmcpherson](https://github.com/deanmcpherson)) - -## [v0.1.1](https://github.com/feathersjs/authentication/tree/v0.1.1) (2016-01-30) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.1.0...v0.1.1) - -## [v0.1.0](https://github.com/feathersjs/authentication/tree/v0.1.0) (2016-01-25) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.0.8...v0.1.0) - -**Closed issues:** - -- Get the Travis build to work. [\#27](https://github.com/feathersjs/authentication/issues/27) -- Login not working [\#24](https://github.com/feathersjs/authentication/issues/24) -- Hooks should be configurable \(they should be functions\) [\#11](https://github.com/feathersjs/authentication/issues/11) -- Document the bundled hooks. [\#10](https://github.com/feathersjs/authentication/issues/10) - -**Merged pull requests:** - -- Migrate docs to book [\#31](https://github.com/feathersjs/authentication/pull/31) ([marshallswain](https://github.com/marshallswain)) -- hashPassword: Async bcrypt usage needs a promise [\#30](https://github.com/feathersjs/authentication/pull/30) ([marshallswain](https://github.com/marshallswain)) -- Removing extras from travis.yml [\#29](https://github.com/feathersjs/authentication/pull/29) ([marshallswain](https://github.com/marshallswain)) -- Fixing build [\#28](https://github.com/feathersjs/authentication/pull/28) ([marshallswain](https://github.com/marshallswain)) -- Adding nsp check [\#26](https://github.com/feathersjs/authentication/pull/26) ([marshallswain](https://github.com/marshallswain)) - -## [v0.0.8](https://github.com/feathersjs/authentication/tree/v0.0.8) (2016-01-16) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.0.7...v0.0.8) - -**Merged pull requests:** - -- Support services that use pagination. [\#23](https://github.com/feathersjs/authentication/pull/23) ([marshallswain](https://github.com/marshallswain)) - -## [v0.0.7](https://github.com/feathersjs/authentication/tree/v0.0.7) (2016-01-07) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.0.6...v0.0.7) - -**Closed issues:** - -- Password isn't removed from responses when using a mongoose service for users endpoint [\#19](https://github.com/feathersjs/authentication/issues/19) -- next called twice using socket.io and using an unauthenticated service [\#17](https://github.com/feathersjs/authentication/issues/17) -- Switch to a callback-based field configuration? [\#15](https://github.com/feathersjs/authentication/issues/15) -- Cannot authenticate [\#14](https://github.com/feathersjs/authentication/issues/14) -- Allow require without `.default` [\#13](https://github.com/feathersjs/authentication/issues/13) -- Login validation [\#2](https://github.com/feathersjs/authentication/issues/2) - -**Merged pull requests:** - -- Adding separate route for refreshing a login token. [\#21](https://github.com/feathersjs/authentication/pull/21) ([corymsmith](https://github.com/corymsmith)) -- Converting user model to object when using mongoose service [\#20](https://github.com/feathersjs/authentication/pull/20) ([corymsmith](https://github.com/corymsmith)) -- Fixing issue where next is called twice when hitting an unauthenticated service via socket.io [\#18](https://github.com/feathersjs/authentication/pull/18) ([corymsmith](https://github.com/corymsmith)) -- Fixing usage of mongoose service [\#16](https://github.com/feathersjs/authentication/pull/16) ([corymsmith](https://github.com/corymsmith)) - -## [v0.0.6](https://github.com/feathersjs/authentication/tree/v0.0.6) (2015-11-22) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.0.5...v0.0.6) - -**Closed issues:** - -- Feathers Auth Configuration Error [\#12](https://github.com/feathersjs/authentication/issues/12) -- Make sure we're returning proper error responses. [\#8](https://github.com/feathersjs/authentication/issues/8) - -## [v0.0.5](https://github.com/feathersjs/authentication/tree/v0.0.5) (2015-11-19) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.0.4...v0.0.5) - -## [v0.0.4](https://github.com/feathersjs/authentication/tree/v0.0.4) (2015-11-19) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v0.0.3...v0.0.4) - -## [v0.0.3](https://github.com/feathersjs/authentication/tree/v0.0.3) (2015-11-18) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v1.0.6...v0.0.3) - -**Merged pull requests:** - -- allow runtime auth via socket.io [\#4](https://github.com/feathersjs/authentication/pull/4) ([randomnerd](https://github.com/randomnerd)) - -## [v1.0.6](https://github.com/feathersjs/authentication/tree/v1.0.6) (2015-11-02) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v1.0.5...v1.0.6) - -## [v1.0.5](https://github.com/feathersjs/authentication/tree/v1.0.5) (2015-11-02) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v1.0.4...v1.0.5) - -## [v1.0.4](https://github.com/feathersjs/authentication/tree/v1.0.4) (2015-11-02) - -[Full Changelog](https://github.com/feathersjs/authentication/compare/v1.0.3...v1.0.4) - -## [v1.0.3](https://github.com/feathersjs/authentication/tree/v1.0.3) (2015-10-12) - -\* _This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)_ diff --git a/packages/authentication/LICENSE b/packages/authentication/LICENSE deleted file mode 100644 index 7712f870f3..0000000000 --- a/packages/authentication/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2024 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 -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -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 deleted file mode 100644 index c669c7c280..0000000000 --- a/packages/authentication/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# @feathersjs/authentication - -[![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/authentication.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/authentication) -[![Discord](https://badgen.net/badge/icon/discord?icon=discord&label)](https://discord.gg/qa8kez8QBx) - -> Add Authentication to your FeathersJS app. - -## Installation - -``` -npm install @feathersjs/authentication --save -``` - -## Documentation - -Refer to the [Feathers authentication API documentation](https://feathersjs.com/api/authentication/) 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/authentication/package.json b/packages/authentication/package.json deleted file mode 100644 index 3f10ef4ed8..0000000000 --- a/packages/authentication/package.json +++ /dev/null @@ -1,80 +0,0 @@ -{ - "name": "@feathersjs/authentication", - "description": "Add Authentication to your FeathersJS app.", - "version": "5.0.34", - "homepage": "https://feathersjs.com", - "main": "lib/", - "types": "lib/", - "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", - "directory": "packages/authentication" - }, - "author": { - "name": "Feathers contributors", - "email": "hello@feathersjs.com", - "url": "https://feathersjs.com" - }, - "files": [ - "CHANGELOG.md", - "LICENSE", - "README.md", - "src/**", - "lib/**", - "*.d.ts", - "*.js" - ], - "contributors": [], - "bugs": { - "url": "https://github.com/feathersjs/feathers/issues" - }, - "engines": { - "node": ">= 12" - }, - "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" - }, - "directories": { - "lib": "lib" - }, - "publishConfig": { - "access": "public" - }, - "dependencies": { - "@feathersjs/commons": "^5.0.34", - "@feathersjs/errors": "^5.0.34", - "@feathersjs/feathers": "^5.0.34", - "@feathersjs/hooks": "^0.9.0", - "@feathersjs/schema": "^5.0.34", - "@feathersjs/transport-commons": "^5.0.34", - "@types/jsonwebtoken": "^9.0.10", - "jsonwebtoken": "^9.0.2", - "lodash": "^4.17.21", - "long-timeout": "^0.1.1", - "uuid": "^11.1.0" - }, - "devDependencies": { - "@feathersjs/memory": "^5.0.34", - "@types/lodash": "^4.17.20", - "@types/mocha": "^10.0.10", - "@types/node": "^24.1.0", - "@types/uuid": "^10.0.0", - "mocha": "^11.7.1", - "shx": "^0.4.0", - "ts-node": "^10.9.2", - "typescript": "^5.9.2" - }, - "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" -} diff --git a/packages/authentication/src/core.ts b/packages/authentication/src/core.ts deleted file mode 100644 index 623bc56d40..0000000000 --- a/packages/authentication/src/core.ts +++ /dev/null @@ -1,318 +0,0 @@ -import merge from 'lodash/merge' -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 { IncomingMessage, ServerResponse } from 'http' -import { AuthenticationConfiguration, defaultOptions } from './options' - -const debug = createDebug('@feathersjs/authentication/base') - -export interface AuthenticationResult { - [key: string]: any -} - -export interface AuthenticationRequest { - strategy?: string - [key: string]: any -} - -export interface AuthenticationParams extends Params { - payload?: { [key: string]: any } - jwtOptions?: SignOptions - authStrategies?: string[] - secret?: string - [key: string]: any -} - -export type ConnectionEvent = 'login' | 'logout' | 'disconnect' - -export interface AuthenticationStrategy { - /** - * Implement this method to get access to the AuthenticationService - * - * @param auth The AuthenticationService - */ - setAuthentication?(auth: AuthenticationBase): void - /** - * Implement this method to get access to the Feathers application - * - * @param app The Feathers application instance - */ - setApplication?(app: Application): void - /** - * Implement this method to get access to the strategy name - * - * @param name The name of the strategy - */ - setName?(name: string): void - /** - * Implement this method to verify the current configuration - * and throw an error if it is invalid. - */ - verifyConfiguration?(): void - /** - * Implement this method to setup this strategy - * @param auth The AuthenticationService - * @param name The name of the strategy - */ - setup?(auth: AuthenticationBase, name: string): Promise - /** - * Authenticate an authentication request with this strategy. - * Should throw an error if the strategy did not succeed. - * - * @param authentication The authentication request - * @param params The service call parameters - */ - authenticate?( - authentication: AuthenticationRequest, - params: AuthenticationParams - ): Promise - /** - * Update a real-time connection according to this strategy. - * - * @param connection The real-time connection - * @param context The hook context - */ - handleConnection?(event: ConnectionEvent, connection: any, authResult?: AuthenticationResult): Promise - /** - * Parse a basic HTTP request and response for authentication request information. - * - * @param req The HTTP request - * @param res The HTTP response - */ - parse?(req: IncomingMessage, res: ServerResponse): Promise -} - -export interface JwtVerifyOptions extends VerifyOptions { - algorithm?: string | string[] -} - -/** - * A base class for managing authentication strategies and creating and verifying JWTs - */ -export class AuthenticationBase { - app: Application - strategies: { [key: string]: AuthenticationStrategy } - configKey: string - isReady: boolean - - /** - * Create a new authentication service. - * - * @param app The Feathers application instance - * @param configKey The configuration key name in `app.get` (default: `authentication`) - * @param options Optional initial options - */ - constructor(app: Application, configKey = 'authentication', options = {}) { - if (!app || typeof app.use !== 'function') { - throw new Error('An application instance has to be passed to the authentication service') - } - - this.app = app - this.strategies = {} - this.configKey = configKey - this.isReady = false - - app.set('defaultAuthentication', app.get('defaultAuthentication') || configKey) - app.set(configKey, merge({}, app.get(configKey), options)) - } - - /** - * Return the current configuration from the application - */ - get configuration(): AuthenticationConfiguration { - // Always returns a copy of the authentication configuration - return Object.assign({}, defaultOptions, this.app.get(this.configKey)) - } - - /** - * A list of all registered strategy names - */ - get strategyNames() { - return Object.keys(this.strategies) - } - - /** - * Register a new authentication strategy under a given name. - * - * @param name The name to register the strategy under - * @param strategy The authentication strategy instance - */ - register(name: string, strategy: AuthenticationStrategy) { - // Call the functions a strategy can implement - if (typeof strategy.setName === 'function') { - strategy.setName(name) - } - - if (typeof strategy.setApplication === 'function') { - strategy.setApplication(this.app) - } - - if (typeof strategy.setAuthentication === 'function') { - strategy.setAuthentication(this) - } - - if (typeof strategy.verifyConfiguration === 'function') { - strategy.verifyConfiguration() - } - - // Register strategy as name - this.strategies[name] = strategy - - if (this.isReady) { - strategy.setup?.(this, name) - } - } - - /** - * Get the registered authentication strategies for a list of names. - * - * @param names The list or strategy names - */ - getStrategies(...names: string[]) { - return names.map((name) => this.strategies[name]).filter((current) => !!current) - } - - /** - * Returns a single strategy by name - * - * @param name The strategy name - * @returns The authentication strategy or undefined - */ - getStrategy(name: string) { - return this.strategies[name] - } - - /** - * Create a new access token with payload and options. - * - * @param payload The JWT payload - * @param optsOverride The options to extend the defaults (`configuration.jwtOptions`) with - * @param secretOverride Use a different secret instead - */ - async createAccessToken( - payload: string | Buffer | object, - optsOverride?: SignOptions, - secretOverride?: Secret - ) { - const { secret, jwtOptions } = this.configuration - // Use configuration by default but allow overriding the secret - const jwtSecret = secretOverride || secret - // Default jwt options merged with additional options - const options = merge({}, jwtOptions, optsOverride) - - if (!options.jwtid) { - // Generate a UUID as JWT ID by default - options.jwtid = uuidv4() - } - - return jsonwebtoken.sign(payload, jwtSecret, options) - } - - /** - * Verifies an access token. - * - * @param accessToken The token to verify - * @param optsOverride The options to extend the defaults (`configuration.jwtOptions`) with - * @param secretOverride Use a different secret instead - */ - async verifyAccessToken(accessToken: string, optsOverride?: JwtVerifyOptions, secretOverride?: Secret) { - const { secret, jwtOptions } = this.configuration - const jwtSecret = secretOverride || secret - const options = merge({}, jwtOptions, optsOverride) - const { algorithm } = options - - // Normalize the `algorithm` setting into the algorithms array - if (algorithm && !options.algorithms) { - options.algorithms = (Array.isArray(algorithm) ? algorithm : [algorithm]) as Algorithm[] - delete options.algorithm - } - - try { - const verified = jsonwebtoken.verify(accessToken, jwtSecret, options) - - return verified as any - } catch (error: any) { - throw new NotAuthenticated(error.message, error) - } - } - - /** - * Authenticate a given authentication request against a list of strategies. - * - * @param authentication The authentication request - * @param params Service call parameters - * @param allowed A list of allowed strategy names - */ - async authenticate( - authentication: AuthenticationRequest, - params: AuthenticationParams, - ...allowed: string[] - ) { - const { strategy } = authentication || {} - const [authStrategy] = this.getStrategies(strategy) - const strategyAllowed = allowed.includes(strategy) - - debug('Running authenticate for strategy', strategy, allowed) - - if (!authentication || !authStrategy || !strategyAllowed) { - const additionalInfo = - (!strategy && ' (no `strategy` set)') || - (!strategyAllowed && ' (strategy not allowed in authStrategies)') || - '' - - // If there are no valid strategies or `authentication` is not an object - throw new NotAuthenticated('Invalid authentication information' + additionalInfo) - } - - return authStrategy.authenticate(authentication, { - ...params, - authenticated: true - }) - } - - async handleConnection(event: ConnectionEvent, connection: any, authResult?: AuthenticationResult) { - const strategies = this.getStrategies(...Object.keys(this.strategies)).filter( - (current) => typeof current.handleConnection === 'function' - ) - - for (const strategy of strategies) { - await strategy.handleConnection(event, connection, authResult) - } - } - - /** - * Parse an HTTP request and response for authentication request information. - * - * @param req The HTTP request - * @param res The HTTP response - * @param names A list of strategies to use - */ - async parse(req: IncomingMessage, res: ServerResponse, ...names: string[]) { - const strategies = this.getStrategies(...names).filter((current) => typeof current.parse === 'function') - - debug('Strategies parsing HTTP header for authentication information', names) - - for (const authStrategy of strategies) { - const value = await authStrategy.parse(req, res) - - if (value !== null) { - return value - } - } - - return null - } - - async setup() { - this.isReady = true - - for (const name of Object.keys(this.strategies)) { - const strategy = this.strategies[name] - - await strategy.setup?.(this, name) - } - } -} diff --git a/packages/authentication/src/hooks/authenticate.ts b/packages/authentication/src/hooks/authenticate.ts deleted file mode 100644 index ad3cdf4c11..0000000000 --- a/packages/authentication/src/hooks/authenticate.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { HookContext, NextFunction } from '@feathersjs/feathers' -import { NotAuthenticated } from '@feathersjs/errors' -import { createDebug } from '@feathersjs/commons' - -const debug = createDebug('@feathersjs/authentication/hooks/authenticate') - -export interface AuthenticateHookSettings { - service?: string - strategies?: string[] -} - -export default (originalSettings: string | AuthenticateHookSettings, ...originalStrategies: string[]) => { - const settings = - typeof originalSettings === 'string' - ? { strategies: [originalSettings, ...originalStrategies] } - : originalSettings - - if (!originalSettings || settings.strategies.length === 0) { - throw new Error('The authenticate hook needs at least one allowed strategy') - } - - return async (context: HookContext, _next?: NextFunction) => { - const next = typeof _next === 'function' ? _next : async () => context - const { app, params, type, path, service } = context - const { strategies } = settings - const { provider, authentication } = params - const authService = app.defaultAuthentication(settings.service) - - debug(`Running authenticate hook on '${path}'`) - - if (type && type !== 'before' && type !== 'around') { - throw new NotAuthenticated('The authenticate hook must be used as a before hook') - } - - if (!authService || typeof authService.authenticate !== 'function') { - throw new NotAuthenticated('Could not find a valid authentication service') - } - - if (service === authService) { - throw new NotAuthenticated( - 'The authenticate hook does not need to be used on the authentication service' - ) - } - - if (params.authenticated === true) { - return next() - } - - if (authentication) { - const { provider, authentication, ...authParams } = params - - debug('Authenticating with', authentication, strategies) - - const authResult = await authService.authenticate(authentication, authParams, ...strategies) - - const { accessToken, ...authResultWithoutToken } = authResult - - context.params = { - ...params, - ...authResultWithoutToken, - authenticated: true - } - } else if (provider) { - throw new NotAuthenticated('Not authenticated') - } - - return next() - } -} diff --git a/packages/authentication/src/hooks/connection.ts b/packages/authentication/src/hooks/connection.ts deleted file mode 100644 index 4cf06c12d6..0000000000 --- a/packages/authentication/src/hooks/connection.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { HookContext, NextFunction } from '@feathersjs/feathers' -import { AuthenticationBase, ConnectionEvent } from '../core' - -export default (event: ConnectionEvent) => async (context: HookContext, next: NextFunction) => { - await next() - - const { - result, - params: { connection } - } = context - - if (connection) { - const service = context.service as unknown as AuthenticationBase - - await service.handleConnection(event, connection, result) - } -} diff --git a/packages/authentication/src/hooks/event.ts b/packages/authentication/src/hooks/event.ts deleted file mode 100644 index 44b6953b91..0000000000 --- a/packages/authentication/src/hooks/event.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { HookContext, NextFunction } from '@feathersjs/feathers' -import { createDebug } from '@feathersjs/commons' -import { ConnectionEvent } from '../core' - -const debug = createDebug('@feathersjs/authentication/hooks/connection') - -export default (event: ConnectionEvent) => async (context: HookContext, next: NextFunction) => { - await next() - - const { app, result, params } = context - - if (params.provider && result) { - debug(`Sending authentication event '${event}'`) - app.emit(event, result, params, context) - } -} diff --git a/packages/authentication/src/hooks/index.ts b/packages/authentication/src/hooks/index.ts deleted file mode 100644 index 4c9a354cfa..0000000000 --- a/packages/authentication/src/hooks/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export { default as authenticate } from './authenticate' -export { default as connection } from './connection' -export { default as event } from './event' diff --git a/packages/authentication/src/index.ts b/packages/authentication/src/index.ts deleted file mode 100644 index f7ea82a173..0000000000 --- a/packages/authentication/src/index.ts +++ /dev/null @@ -1,15 +0,0 @@ -export * as hooks from './hooks' -export { authenticate } from './hooks' -export { - AuthenticationBase, - AuthenticationRequest, - AuthenticationResult, - AuthenticationStrategy, - AuthenticationParams, - ConnectionEvent, - JwtVerifyOptions -} from './core' -export { AuthenticationBaseStrategy } from './strategy' -export { AuthenticationService } from './service' -export { JWTStrategy } from './jwt' -export { authenticationSettingsSchema, AuthenticationConfiguration } from './options' diff --git a/packages/authentication/src/jwt.ts b/packages/authentication/src/jwt.ts deleted file mode 100644 index 0724760b12..0000000000 --- a/packages/authentication/src/jwt.ts +++ /dev/null @@ -1,190 +0,0 @@ -/* 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 { createDebug } from '@feathersjs/commons' -// @ts-ignore -import lt from 'long-timeout' - -import { AuthenticationBaseStrategy } from './strategy' -import { AuthenticationParams, AuthenticationRequest, AuthenticationResult, ConnectionEvent } from './core' - -const debug = createDebug('@feathersjs/authentication/jwt') -const SPLIT_HEADER = /(\S+)\s+(\S+)/ - -export class JWTStrategy extends AuthenticationBaseStrategy { - expirationTimers = new WeakMap() - - get configuration() { - const authConfig = this.authentication.configuration - const config = super.configuration - - return { - service: authConfig.service, - entity: authConfig.entity, - entityId: authConfig.entityId, - header: 'Authorization', - schemes: ['Bearer', 'JWT'], - ...config - } - } - - async handleConnection( - event: ConnectionEvent, - connection: any, - authResult?: AuthenticationResult - ): Promise { - const isValidLogout = - event === 'logout' && - connection.authentication && - authResult && - connection.authentication.accessToken === authResult.accessToken - - const { accessToken } = authResult || {} - const { entity } = this.configuration - - if (accessToken && event === 'login') { - debug('Adding authentication information to connection') - const { exp } = - authResult?.authentication?.payload || (await this.authentication.verifyAccessToken(accessToken)) - // The time (in ms) until the token expires - const duration = exp * 1000 - Date.now() - const timer = lt.setTimeout(() => this.app.emit('disconnect', connection), duration) - - debug(`Registering connection expiration timer for ${duration}ms`) - lt.clearTimeout(this.expirationTimers.get(connection)) - this.expirationTimers.set(connection, timer) - - debug('Adding authentication information to connection') - connection.authentication = { - strategy: this.name, - accessToken - } - connection[entity] = authResult[entity] - } else if (event === 'disconnect' || isValidLogout) { - debug('Removing authentication information and expiration timer from connection') - - await new Promise((resolve) => - process.nextTick(() => { - delete connection[entity] - delete connection.authentication - resolve(connection) - }) - ) - - lt.clearTimeout(this.expirationTimers.get(connection)) - this.expirationTimers.delete(connection) - } - } - - verifyConfiguration() { - const allowedKeys = ['entity', 'entityId', 'service', 'header', 'schemes'] - - for (const key of Object.keys(this.configuration)) { - if (!allowedKeys.includes(key)) { - throw new Error( - `Invalid JwtStrategy option 'authentication.${this.name}.${key}'. Did you mean to set it in 'authentication.jwtOptions'?` - ) - } - } - - if (typeof this.configuration.header !== 'string') { - throw new Error(`The 'header' option for the ${this.name} strategy must be a string`) - } - } - - async getEntityQuery(_params: Params) { - return {} - } - - /** - * Return the entity for a given id - * - * @param id The id to use - * @param params Service call parameters - */ - async getEntity(id: string, params: Params) { - const entityService = this.entityService - const { entity } = this.configuration - - debug('Getting entity', id) - - if (entityService === null) { - throw new NotAuthenticated('Could not find entity service') - } - - const query = await this.getEntityQuery(params) - const { provider, ...paramsWithoutProvider } = params - const result = await entityService.get(id, { - ...paramsWithoutProvider, - query - }) - - if (!params.provider) { - return result - } - - return entityService.get(id, { ...params, [entity]: result }) - } - - async getEntityId(authResult: AuthenticationResult, _params: Params) { - return authResult.authentication.payload.sub - } - - async authenticate(authentication: AuthenticationRequest, params: AuthenticationParams) { - const { accessToken } = authentication - const { entity } = this.configuration - - if (!accessToken) { - throw new NotAuthenticated('No access token') - } - - const payload = await this.authentication.verifyAccessToken(accessToken, params.jwt) - const result = { - accessToken, - authentication: { - strategy: 'jwt', - accessToken, - payload - } - } - - if (entity === null) { - return result - } - - const entityId = await this.getEntityId(result, params) - const value = await this.getEntity(entityId, params) - - return { - ...result, - [entity]: value - } - } - - async parse(req: IncomingMessage): Promise<{ - strategy: string - accessToken: string - } | null> { - const { header, schemes }: { header: string; schemes: string[] } = this.configuration - const headerValue = req.headers && req.headers[header.toLowerCase()] - - if (!headerValue || typeof headerValue !== 'string') { - return null - } - - debug('Found parsed header value') - - const [, scheme, schemeValue] = headerValue.match(SPLIT_HEADER) || [] - const hasScheme = scheme && schemes.some((current) => new RegExp(current, 'i').test(scheme)) - - if (scheme && !hasScheme) { - return null - } - - return { - strategy: this.name, - accessToken: hasScheme ? schemeValue : headerValue - } - } -} diff --git a/packages/authentication/src/options.ts b/packages/authentication/src/options.ts deleted file mode 100644 index 2176889087..0000000000 --- a/packages/authentication/src/options.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { FromSchema, authenticationSettingsSchema } from '@feathersjs/schema' - -export const defaultOptions = { - authStrategies: [] as string[], - jwtOptions: { - header: { typ: 'access' }, // by default is an access token but can be any type - audience: 'https://yourdomain.com', // The resource server where the token is processed - issuer: 'feathers', // The issuing server, application or resource - algorithm: 'HS256', - expiresIn: '1d' - } -} - -export { authenticationSettingsSchema } - -export type AuthenticationConfiguration = FromSchema diff --git a/packages/authentication/src/service.ts b/packages/authentication/src/service.ts deleted file mode 100644 index cba07330a1..0000000000 --- a/packages/authentication/src/service.ts +++ /dev/null @@ -1,203 +0,0 @@ -import merge from 'lodash/merge' -import { NotAuthenticated } from '@feathersjs/errors' -import '@feathersjs/transport-commons' -import { createDebug } from '@feathersjs/commons' -import { 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' - -const debug = createDebug('@feathersjs/authentication/service') - -declare module '@feathersjs/feathers/lib/declarations' { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - interface FeathersApplication { - // eslint-disable-line - /** - * Returns the default authentication service or the - * authentication service for a given path. - * - * @param location The service path to use (optional) - */ - defaultAuthentication?(location?: string): AuthenticationService - } - - interface Params { - authenticated?: boolean - authentication?: AuthenticationRequest - } -} - -export class AuthenticationService - extends AuthenticationBase - implements Partial> -{ - constructor(app: any, configKey = 'authentication', options = {}) { - super(app, configKey, options) - - hooks(this, { - create: [resolveDispatch(), event('login'), connection('login')], - remove: [resolveDispatch(), event('logout'), connection('logout')] - }) - - this.app.on('disconnect', async (connection: RealTimeConnection) => { - await this.handleConnection('disconnect', connection) - }) - - if (typeof app.defaultAuthentication !== 'function') { - app.defaultAuthentication = function (location?: string) { - const configKey = app.get('defaultAuthentication') - const path = - location || - Object.keys(this.services).find((current) => this.service(current).configKey === configKey) - - return path ? this.service(path) : null - } - } - } - /** - * Return the payload for a JWT based on the authentication result. - * Called internally by the `create` method. - * - * @param _authResult The current authentication result - * @param params The service call parameters - */ - async getPayload(_authResult: AuthenticationResult, params: AuthenticationParams) { - // Uses `params.payload` or returns an empty payload - const { payload = {} } = params - - return payload - } - - /** - * Returns the JWT options based on an authentication result. - * By default sets the JWT subject to the entity id. - * - * @param authResult The authentication result - * @param params Service call parameters - */ - async getTokenOptions(authResult: AuthenticationResult, params: AuthenticationParams) { - const { service, entity, entityId } = this.configuration - const jwtOptions = merge({}, params.jwtOptions, params.jwt) - const value = service && entity && authResult[entity] - - // Set the subject to the entity id if it is available - if (value && !jwtOptions.subject) { - const idProperty = entityId || this.app.service(service).id - const subject = value[idProperty] - - if (subject === undefined) { - throw new NotAuthenticated(`Can not set subject from ${entity}.${idProperty}`) - } - - jwtOptions.subject = `${subject}` - } - - return jwtOptions - } - - /** - * Create and return a new JWT for a given authentication request. - * Will trigger the `login` event. - * - * @param data The authentication request (should include `strategy` key) - * @param params Service call parameters - */ - async create(data: AuthenticationRequest, params?: AuthenticationParams) { - const authStrategies = params.authStrategies || this.configuration.authStrategies - - if (!authStrategies.length) { - throw new NotAuthenticated('No authentication strategies allowed for creating a JWT (`authStrategies`)') - } - - const authResult = await this.authenticate(data, params, ...authStrategies) - - debug('Got authentication result', authResult) - - if (authResult.accessToken) { - return authResult - } - - const [payload, jwtOptions] = await Promise.all([ - this.getPayload(authResult, params), - this.getTokenOptions(authResult, params) - ]) - - debug('Creating JWT with', payload, jwtOptions) - - const accessToken = await this.createAccessToken(payload, jwtOptions, params.secret) - - return { - accessToken, - ...authResult, - authentication: { - ...authResult.authentication, - payload: jsonwebtoken.decode(accessToken) - } - } - } - - /** - * Mark a JWT as removed. By default only verifies the JWT and returns the result. - * Triggers the `logout` event. - * - * @param id The JWT to remove or null - * @param params Service call parameters - */ - async remove(id: string | null, params?: AuthenticationParams) { - const { authentication } = params - const { authStrategies } = this.configuration - - // When an id is passed it is expected to be the authentication `accessToken` - if (id !== null && id !== authentication.accessToken) { - throw new NotAuthenticated('Invalid access token') - } - - debug('Verifying authentication strategy in remove') - - return this.authenticate(authentication, params, ...authStrategies) - } - - /** - * Validates the service configuration. - */ - async setup() { - await super.setup() - - // The setup method checks for valid settings and registers the - // connection and event (login, logout) hooks - const { secret, service, entity, entityId } = this.configuration - - if (typeof secret !== 'string') { - throw new Error("A 'secret' must be provided in your authentication configuration") - } - - if (entity !== null) { - if (service === undefined) { - throw new Error("The 'service' option is not set in the authentication configuration") - } - - if (this.app.service(service) === undefined) { - throw new Error( - `The '${service}' entity service does not exist (set to 'null' if it is not required)` - ) - } - - if (this.app.service(service).id === undefined && entityId === undefined) { - throw new Error( - `The '${service}' service does not have an 'id' property and no 'entityId' option is set.` - ) - } - } - - const publishable = this as any - - if (typeof publishable.publish === 'function') { - publishable.publish((): any => null) - } - } -} diff --git a/packages/authentication/src/strategy.ts b/packages/authentication/src/strategy.ts deleted file mode 100644 index 99a1ec9c58..0000000000 --- a/packages/authentication/src/strategy.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { AuthenticationStrategy, AuthenticationBase } from './core' -import { Application, Service } from '@feathersjs/feathers' - -export class AuthenticationBaseStrategy implements AuthenticationStrategy { - authentication?: AuthenticationBase - app?: Application - name?: string - - setAuthentication(auth: AuthenticationBase) { - this.authentication = auth - } - - setApplication(app: Application) { - this.app = app - } - - setName(name: string) { - this.name = name - } - - get configuration(): any { - return this.authentication.configuration[this.name] - } - - get entityService(): Service { - const { service } = this.configuration - - if (!service) { - return null - } - - return this.app.service(service) || null - } -} diff --git a/packages/authentication/test/core.test.ts b/packages/authentication/test/core.test.ts deleted file mode 100644 index 3ffcf97ec3..0000000000 --- a/packages/authentication/test/core.test.ts +++ /dev/null @@ -1,445 +0,0 @@ -/* eslint-disable @typescript-eslint/ban-ts-comment */ -import assert from 'assert' -import { feathers, Application } from '@feathersjs/feathers' -import jwt from 'jsonwebtoken' -import { Infer, schema } from '@feathersjs/schema' - -import { AuthenticationBase, AuthenticationRequest } from '../src/core' -import { authenticationSettingsSchema } from '../src/options' -import { Strategy1, Strategy2, MockRequest } from './fixtures' -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}/ - -describe('authentication/core', () => { - let app: Application - let auth: AuthenticationBase - - beforeEach(() => { - app = feathers() - auth = new AuthenticationBase(app, 'authentication', { - entity: 'user', - service: 'users', - secret: 'supersecret', - first: { hello: 'test' } - }) - - auth.register('first', new Strategy1()) - auth.register('second', new Strategy2()) - auth.register('dummy', { - async authenticate(data: AuthenticationRequest) { - return data - } - }) - }) - - describe('configuration', () => { - it('infers configuration from settings schema', async () => { - const settingsSchema = schema({ - $id: 'AuthSettingsSchema', - ...authenticationSettingsSchema - } as const) - type Settings = Infer - const config: Settings = { - entity: 'user', - secret: 'supersecret', - authStrategies: ['some', 'thing'] - } - - await settingsSchema.validate(config) - }) - - it('throws an error when app is not provided', () => { - try { - // @ts-ignore - const otherAuth = new AuthenticationBase() - assert.fail('Should never get here') - assert.ok(otherAuth) - } catch (error: any) { - assert.strictEqual( - error.message, - 'An application instance has to be passed to the authentication service' - ) - } - }) - - it('sets defaults', () => { - // Getting configuration twice returns a copy - assert.notStrictEqual(auth.configuration, auth.configuration) - assert.strictEqual(auth.configuration.entity, 'user') - }) - - it('allows to override jwtOptions, does not merge', () => { - const { jwtOptions } = auth.configuration - const auth2options = { - jwtOptions: { - expiresIn: '1w' - } - } - - app.set('auth2', auth2options) - - const auth2 = new AuthenticationBase(app, 'auth2') - - assert.ok(jwtOptions) - assert.strictEqual(jwtOptions.expiresIn, '1d') - assert.strictEqual(jwtOptions.issuer, 'feathers') - - assert.deepStrictEqual(auth2.configuration.jwtOptions, auth2options.jwtOptions) - }) - - it('sets configKey and defaultAuthentication', () => { - assert.strictEqual(app.get('defaultAuthentication'), 'authentication') - }) - - it('uses default configKey', () => { - const otherApp = feathers() - const otherAuth = new AuthenticationBase(otherApp) - - assert.ok(otherAuth) - assert.strictEqual(otherApp.get('defaultAuthentication'), 'authentication') - assert.deepStrictEqual(otherApp.get('authentication'), {}) - }) - }) - - describe('strategies', () => { - it('strategyNames', () => { - assert.deepStrictEqual(auth.strategyNames, ['first', 'second', 'dummy']) - }) - - it('getStrategies', () => { - const first = auth.getStrategies('first') - const invalid = auth.getStrategies('first', 'invalid', 'second') - - assert.strictEqual(first.length, 1) - assert.strictEqual(invalid.length, 2, 'Filtered out invalid strategies') - }) - - it('getStrategy', () => { - const first = auth.getStrategy('first') - - assert.ok(first) - }) - - it('calls setName, setApplication and setAuthentication if available', () => { - const [first] = auth.getStrategies('first') as [Strategy1] - - assert.strictEqual(first.name, 'first') - assert.strictEqual(first.app, app) - assert.strictEqual(first.authentication, auth) - }) - - it('strategy configuration getter', () => { - const [first] = auth.getStrategies('first') as [Strategy1] - - assert.deepStrictEqual(first.configuration, { hello: 'test' }) - }) - - it('strategy configuration getter', () => { - const [first] = auth.getStrategies('first') as [Strategy1] - const oldService = auth.configuration.service - - delete auth.configuration.service - - assert.strictEqual(first.entityService, null) - - auth.configuration.service = oldService - }) - }) - - describe('authenticate', () => { - describe('with strategy set in params', () => { - it('returns first success', async () => { - const result = await auth.authenticate( - { - strategy: 'first', - username: 'David' - }, - {}, - 'first', - 'second' - ) - - assert.deepStrictEqual(result, Strategy1.result) - }) - - it('returns error when failed', async () => { - try { - await auth.authenticate( - { - strategy: 'first', - username: 'Steve' - }, - {}, - 'first', - 'second' - ) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotAuthenticated') - assert.strictEqual(error.message, 'Invalid Dave') - } - }) - - it('returns second success', async () => { - const authentication = { - strategy: 'second', - v2: true, - password: 'supersecret' - } - - const result = await auth.authenticate(authentication, {}, 'first', 'second') - - assert.deepStrictEqual( - result, - Object.assign({}, Strategy2.result, { - authentication, - params: { authenticated: true } - }) - ) - }) - - it('passes params', async () => { - const params = { - some: 'thing' - } - const authentication = { - strategy: 'second', - v2: true, - password: 'supersecret' - } - - const result = await auth.authenticate(authentication, params, 'first', 'second') - - assert.deepStrictEqual( - result, - Object.assign( - { - params: Object.assign(params, { - authenticated: true - }), - authentication - }, - Strategy2.result - ) - ) - }) - - it('throws error when allowed and passed strategy does not match', async () => { - try { - await auth.authenticate( - { - strategy: 'first', - username: 'Dummy' - }, - {}, - 'second' - ) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotAuthenticated') - assert.strictEqual( - error.message, - 'Invalid authentication information (strategy not allowed in authStrategies)' - ) - } - }) - - it('throws error when strategy is not set', async () => { - try { - await auth.authenticate( - { - username: 'Dummy' - }, - {}, - 'second' - ) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.message, 'Invalid authentication information (no `strategy` set)') - } - }) - }) - }) - - describe('parse', () => { - const res = {} as ServerResponse - - it('returns null when no names are given', async () => { - const req = {} as MockRequest - - assert.strictEqual(await auth.parse(req, res), null) - }) - - it('successfully parses a request (first)', async () => { - const req = { isDave: true } as MockRequest - - const result = await auth.parse(req, res, 'first', 'second') - - assert.deepStrictEqual(result, Strategy1.result) - }) - - it('successfully parses a request (second)', async () => { - const req = { isV2: true } as MockRequest - - const result = await auth.parse(req, res, 'first', 'second') - - assert.deepStrictEqual(result, Strategy2.result) - }) - - it('null when no success', async () => { - const req = {} as MockRequest - - const result = await auth.parse(req, res, 'first', 'second') - - assert.strictEqual(result, null) - }) - }) - - describe('jwt', () => { - const message = 'Some payload' - - describe('createAccessToken', () => { - // it('errors with no payload', () => { - // try { - // // @ts-ignore - // await auth.createAccessToken(); - // assert.fail('Should never get here'); - // } catch (error: any) { - // assert.strictEqual(error.message, 'payload is required'); - // } - // }); - - it('with default options', async () => { - const msg = 'Some payload' - - const accessToken = await auth.createAccessToken({ message: msg }) - const decoded = jwt.decode(accessToken) - const settings = auth.configuration.jwtOptions - - if (decoded === null || typeof decoded === 'string') { - throw new Error('Not encoded properly') - } - - assert.ok(typeof accessToken === 'string') - assert.strictEqual(decoded.message, msg, 'Set payload') - assert.ok(UUID.test(decoded.jti), 'Set `jti` to default UUID') - assert.strictEqual(decoded.aud, settings.audience) - assert.strictEqual(decoded.iss, settings.issuer) - }) - - it('with default and overriden options', async () => { - const overrides = { - issuer: 'someoneelse', - audience: 'people', - jwtid: 'something' - } - - const accessToken = await auth.createAccessToken({ message }, overrides) - - assert.ok(typeof accessToken === 'string') - - const decoded = jwt.decode(accessToken) - - if (decoded === null || typeof decoded === 'string') { - throw new Error('Not encoded properly') - } - - assert.strictEqual(decoded.message, message, 'Set payload') - assert.strictEqual(decoded.jti, 'something') - assert.strictEqual(decoded.aud, overrides.audience) - assert.strictEqual(decoded.iss, overrides.issuer) - }) - - it('errors with invalid options', async () => { - const overrides = { - algorithm: 'fdjsklfsndkl' - } - - try { - // @ts-ignore - await auth.createAccessToken({}, overrides) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.message, '"algorithm" must be a valid string enum value') - } - }) - }) - - describe('verifyAccessToken', () => { - let validToken: string - let expiredToken: string - - beforeEach(async () => { - validToken = await auth.createAccessToken({ message }) - expiredToken = await auth.createAccessToken( - {}, - { - expiresIn: '1ms' - } - ) - }) - - it('returns payload when token is valid', async () => { - const payload = await auth.verifyAccessToken(validToken) - - assert.strictEqual(payload.message, message) - }) - - it('errors when custom algorithm property does not match', async () => { - try { - await auth.verifyAccessToken(validToken, { - algorithm: ['HS512'] - }) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.message, 'invalid algorithm') - } - }) - - it('errors when algorithms property does not match', async () => { - try { - await auth.verifyAccessToken(validToken, { - algorithms: ['HS512'] - }) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.message, 'invalid algorithm') - } - }) - - it('errors when secret is different', async () => { - try { - await auth.verifyAccessToken(validToken, {}, 'fdjskl') - - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.message, 'invalid signature') - } - }) - - it('errors when other custom options do not match', async () => { - try { - await auth.verifyAccessToken(validToken, { issuer: 'someonelse' }) - - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotAuthenticated') - assert.ok(/jwt issuer invalid/.test(error.message)) - } - }) - - it('errors when token is expired', async () => { - try { - await auth.verifyAccessToken(expiredToken) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotAuthenticated') - assert.strictEqual(error.message, 'jwt expired') - assert.strictEqual(error.data.name, 'TokenExpiredError') - assert.ok(error.data.expiredAt) - } - }) - }) - }) -}) diff --git a/packages/authentication/test/fixtures.ts b/packages/authentication/test/fixtures.ts deleted file mode 100644 index aba18afde3..0000000000 --- a/packages/authentication/test/fixtures.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { NotAuthenticated } from '@feathersjs/errors' -import { Params } from '@feathersjs/feathers' - -import { AuthenticationRequest } from '../src/core' -import { IncomingMessage } from 'http' -import { AuthenticationBaseStrategy } from '../src/strategy' - -export interface MockRequest extends IncomingMessage { - isDave?: boolean - isV2?: boolean -} - -export class Strategy1 extends AuthenticationBaseStrategy { - static result = { - user: { - id: 123, - name: 'Dave' - }, - authenticated: true - } - - async authenticate(authentication: AuthenticationRequest) { - if (authentication.username === 'David' || authentication.both) { - return { ...Strategy1.result } - } - - throw new NotAuthenticated('Invalid Dave') - } - - async parse(req: MockRequest) { - if (req.isDave) { - return { ...Strategy1.result } - } - - return null - } -} - -export class Strategy2 extends AuthenticationBaseStrategy { - static result = { - user: { - name: 'V2', - version: 2 - }, - authenticated: true - } - - authenticate(authentication: AuthenticationRequest, params: Params) { - const isV2 = authentication.v2 === true && authentication.password === 'supersecret' - - if (isV2 || authentication.both) { - return Promise.resolve(Object.assign({ params, authentication }, Strategy2.result)) - } - - return Promise.reject(new NotAuthenticated('Invalid v2 user')) - } - - async parse(req: MockRequest) { - if (req.isV2) { - return Strategy2.result - } - - return null - } -} diff --git a/packages/authentication/test/hooks/authenticate.test.ts b/packages/authentication/test/hooks/authenticate.test.ts deleted file mode 100644 index 89b7bad514..0000000000 --- a/packages/authentication/test/hooks/authenticate.test.ts +++ /dev/null @@ -1,256 +0,0 @@ -/* 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' - -const { authenticate } = hooks - -describe('authentication/hooks/authenticate', () => { - let app: Application<{ - authentication: AuthenticationService - 'auth-v2': AuthenticationService - users: Partial & { id: string } - }> - - beforeEach(() => { - app = feathers() - app.use( - 'authentication', - new AuthenticationService(app, 'authentication', { - entity: 'user', - service: 'users', - secret: 'supersecret', - authStrategies: ['first'] - }) - ) - app.use( - 'auth-v2', - new AuthenticationService(app, 'auth-v2', { - entity: 'user', - service: 'users', - secret: 'supersecret', - authStrategies: ['test'] - }) - ) - app.use('users', { - id: 'id', - - async find() { - return [] - }, - - async get(_id: string | number, params: Params) { - return params - } - }) - - const service = app.service('authentication') - - service.register('first', new Strategy1()) - service.register('second', new Strategy2()) - - app.service('auth-v2').register('test', new Strategy1()) - - app.service('users').hooks({ - get: [authenticate('first', 'second')] - }) - - app.service('users').id = 'name' - app.setup() - }) - - it('throws an error when no strategies are passed', () => { - try { - // @ts-ignore - authenticate() - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.message, 'The authenticate hook needs at least one allowed strategy') - } - }) - - it('throws an error when not a before hook', async () => { - const users = app.service('users') - - users.hooks({ - after: { - all: [authenticate('first')] - } - }) - - try { - await users.find() - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotAuthenticated') - assert.strictEqual(error.message, 'The authenticate hook must be used as a before hook') - } - }) - - it('throws an error if authentication service is gone', async () => { - delete app.services.authentication - - try { - await app.service('users').get(1, { - authentication: { - some: 'thing' - } - }) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotAuthenticated') - assert.strictEqual(error.message, 'Could not find a valid authentication service') - } - }) - - it('authenticates with first strategy, merges params', async () => { - const params = { - authentication: { - strategy: 'first', - username: 'David' - } - } - - const result = await app.service('users').get(1, params) - - assert.deepStrictEqual(result, Object.assign({}, params, Strategy1.result)) - }) - - it('authenticates with first strategy, keeps references alive (#1629)', async () => { - const connection = {} - const params = { - connection, - authentication: { - strategy: 'first', - username: 'David' - } - } - - app.service('users').hooks({ - after: { - get: (context) => { - context.result.params = context.params - } - } - }) - - const result = await app.service('users').get(1, params) - - assert.ok(result.params.connection === connection) - }) - - it('authenticates with different authentication service', async () => { - const params = { - authentication: { - strategy: 'test', - username: 'David' - } - } - - app.service('users').hooks({ - before: { - find: [ - authenticate({ - service: 'auth-v2', - strategies: ['test'] - }) - ] - } - }) - - const result = await app.service('users').find(params) - - assert.deepStrictEqual(result, []) - }) - - it('authenticates with second strategy', async () => { - const params = { - authentication: { - strategy: 'second', - v2: true, - password: 'supersecret' - } - } - - const result = await app.service('users').get(1, params) - - assert.deepStrictEqual( - result, - Object.assign( - { - authentication: params.authentication, - params: { authenticated: true } - }, - Strategy2.result - ) - ) - }) - - it('passes for internal calls without authentication', async () => { - const result = await app.service('users').get(1) - - assert.deepStrictEqual(result, {}) - }) - - it('fails for invalid params.authentication', async () => { - try { - await app.service('users').get(1, { - authentication: { - strategy: 'first', - some: 'thing' - } - }) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotAuthenticated') - assert.strictEqual(error.message, 'Invalid Dave') - } - }) - - it('fails for external calls without authentication', async () => { - try { - await app.service('users').get(1, { - provider: 'rest' - }) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotAuthenticated') - assert.strictEqual(error.message, 'Not authenticated') - } - }) - - it('passes with authenticated: true but external call', async () => { - const params = { - provider: 'rest', - authenticated: true - } - const result = await app.service('users').get(1, params) - - assert.deepStrictEqual(result, params) - }) - - it('errors when used on the authentication service', async () => { - const auth = app.service('authentication') - - auth.hooks({ - before: { - create: authenticate('first') - } - }) - - try { - await auth.create({ - strategy: 'first', - username: 'David' - }) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual( - error.message, - 'The authenticate hook does not need to be used on the authentication service' - ) - } - }) -}) diff --git a/packages/authentication/test/hooks/event.test.ts b/packages/authentication/test/hooks/event.test.ts deleted file mode 100644 index e602febdff..0000000000 --- a/packages/authentication/test/hooks/event.test.ts +++ /dev/null @@ -1,83 +0,0 @@ -import assert from 'assert' -import { feathers, HookContext } from '@feathersjs/feathers' - -import hook from '../../src/hooks/event' -import { AuthenticationParams, AuthenticationRequest, AuthenticationResult } from '../../src/core' - -describe('authentication/hooks/events', () => { - const app = feathers().use('authentication', { - async create(data: AuthenticationRequest) { - return data - }, - - async remove(id: string) { - return { id } - } - }) - - const service = app.service('authentication') - - service.hooks({ - create: [hook('login')], - remove: [hook('logout')] - }) - - it('login', (done) => { - const data = { - message: 'test' - } - - app.once('login', (result: AuthenticationResult, params: AuthenticationParams, context: HookContext) => { - try { - assert.deepStrictEqual(result, data) - assert.ok(params.testParam) - assert.ok(context.method, 'create') - done() - } catch (error: any) { - done(error) - } - }) - - service.create(data, { - testParam: true, - provider: 'test' - } as any) - }) - - it('logout', (done) => { - app.once('logout', (result: AuthenticationResult, params: AuthenticationParams, context: HookContext) => { - try { - assert.deepStrictEqual(result, { - id: 'test' - }) - assert.ok(params.testParam) - assert.ok(context.method, 'remove') - done() - } catch (error: any) { - done(error) - } - }) - - service.remove('test', { - testParam: true, - provider: 'test' - } as any) - }) - - it('does nothing when provider is not set', (done) => { - const handler = () => { - done(new Error('Should never get here')) - } - - app.on('logout', handler) - service.once('removed', (result: AuthenticationResult) => { - app.removeListener('logout', handler) - assert.deepStrictEqual(result, { - id: 'test' - }) - done() - }) - - service.remove('test') - }) -}) diff --git a/packages/authentication/test/jwt.test.ts b/packages/authentication/test/jwt.test.ts deleted file mode 100644 index 8120d3cb9f..0000000000 --- a/packages/authentication/test/jwt.test.ts +++ /dev/null @@ -1,492 +0,0 @@ -import assert from 'assert' -import merge from 'lodash/merge' -import { feathers, Application, Service } from '@feathersjs/feathers' -import { memory } from '@feathersjs/memory' -import { getDispatch, resolve, resolveDispatch } from '@feathersjs/schema' - -import { AuthenticationService, JWTStrategy, hooks } from '../src' -import { ServerResponse } from 'http' -import { MockRequest } from './fixtures' - -const { authenticate } = hooks - -describe('authentication/jwt', () => { - let app: Application<{ - authentication: AuthenticationService - users: Partial - protected: Partial - }> - let user: any - let accessToken: string - let payload: any - - const userDispatchResolver = resolve({ - converter: async () => { - return { - dispatch: true, - message: 'Hello world' - } - }, - properties: {} - }) - - beforeEach(async () => { - app = feathers() - - const authService = new AuthenticationService(app, 'authentication', { - entity: 'user', - service: 'users', - secret: 'supersecret', - authStrategies: ['jwt'] - }) - - authService.register('jwt', new JWTStrategy()) - - app.use('users', memory()) - app.use('protected', { - async get(id, params) { - return { - id, - params - } - } - }) - app.use('authentication', authService) - - const service = app.service('authentication') - - app.service('protected').hooks({ - before: { - all: [authenticate('jwt')] - } - }) - - app.service('users').hooks({ - around: { - all: [resolveDispatch(userDispatchResolver)] - }, - after: { - get: [ - (context) => { - if (context.params.provider) { - context.result.isExternal = true - } - - return context - } - ] - } - }) - - user = await app.service('users').create({ - name: 'David' - }) - - accessToken = await service.createAccessToken( - {}, - { - subject: `${user.id}` - } - ) - - payload = await service.verifyAccessToken(accessToken) - app.setup() - }) - - it('getEntity', async () => { - const [strategy] = app.service('authentication').getStrategies('jwt') as JWTStrategy[] - - let entity = await strategy.getEntity(user.id, { - query: { - name: 'Dave' - } - }) - - assert.deepStrictEqual(entity, user) - - entity = await strategy.getEntity(user.id, { - provider: 'rest' - }) - - assert.deepStrictEqual(entity, { - ...user, - isExternal: true - }) - }) - - describe('handleConnection', () => { - it('adds entity and authentication information on create', async () => { - const connection: any = {} - - await app.service('authentication').create( - { - strategy: 'jwt', - accessToken - }, - { connection } - ) - - assert.deepStrictEqual(connection.user, user) - assert.deepStrictEqual(connection.authentication, { - strategy: 'jwt', - accessToken - }) - }) - - it('login event connection has authentication information (#2908)', async () => { - const connection: any = {} - const onLogin = new Promise((resolve, reject) => - app.once('login', (data, { connection }) => { - try { - assert.deepStrictEqual(connection.user, { - ...user, - isExternal: true - }) - resolve(data) - } catch (error) { - reject(error) - } - }) - ) - - await app.service('authentication').create( - { - strategy: 'jwt', - accessToken - }, - { connection, provider: 'test' } - ) - - await onLogin - }) - - it('resolves safe dispatch data in authentication result', async () => { - const authResult = await app.service('authentication').create({ - strategy: 'jwt', - accessToken - }) - - const dispatch = getDispatch(authResult) - - assert.deepStrictEqual(dispatch.user, { dispatch: true, message: 'Hello world' }) - }) - - it('sends disconnect event when connection token expires and removes all connection information', async () => { - const connection: any = {} - const token: string = await app.service('authentication').createAccessToken( - {}, - { - subject: `${user.id}`, - expiresIn: '1s' - } - ) - - const result = await app.service('authentication').create( - { - strategy: 'jwt', - accessToken: token - }, - { connection } - ) - - assert.ok(connection.authentication) - - assert.strictEqual(result.accessToken, token) - - const disconnection = await new Promise((resolve) => app.once('disconnect', resolve)) - - assert.strictEqual(disconnection, connection) - - assert.ok(!connection.authentication) - assert.ok(!connection.user) - assert.strictEqual(Object.keys(connection).length, 0) - }) - - it('deletes authentication information on remove', async () => { - const connection: any = {} - - await app.service('authentication').create( - { - strategy: 'jwt', - accessToken - }, - { connection } - ) - - assert.ok(connection.authentication) - - await app.service('authentication').remove(null, { - authentication: connection.authentication, - connection - }) - - assert.ok(!connection.authentication) - assert.ok(!connection.user) - }) - - it('deletes authentication information on disconnect but maintains it in event handler', async () => { - const connection: any = {} - - await app.service('authentication').create( - { - strategy: 'jwt', - accessToken - }, - { connection } - ) - - assert.ok(connection.authentication) - assert.ok(connection.user) - - const disconnectPromise = new Promise((resolve, reject) => - app.once('disconnect', (connection) => { - try { - assert.ok(connection.authentication) - assert.ok(connection.user) - resolve(connection) - } catch (error) { - reject(error) - } - }) - ) - app.emit('disconnect', connection) - - await disconnectPromise - await new Promise((resolve) => process.nextTick(resolve)) - - assert.ok(!connection.authentication) - assert.ok(!connection.user) - }) - - it('does not remove if accessToken does not match', async () => { - const connection: any = {} - - await app.service('authentication').create( - { - strategy: 'jwt', - accessToken - }, - { connection } - ) - - assert.ok(connection.authentication) - - await app.service('authentication').remove(null, { - authentication: { - strategy: 'jwt', - accessToken: await app.service('authentication').createAccessToken( - {}, - { - subject: `${user.id}` - } - ) - }, - connection - }) - - assert.ok(connection.authentication) - }) - }) - - describe('with authenticate hook', () => { - it('fails for protected service and external call when not set', async () => { - try { - await app.service('protected').get('test', { - provider: 'rest' - }) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotAuthenticated') - assert.strictEqual(error.message, 'Not authenticated') - } - }) - - it('fails for protected service and external call when not strategy', async () => { - try { - await app.service('protected').get('test', { - provider: 'rest', - authentication: { - username: 'Dave' - } - }) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotAuthenticated') - assert.strictEqual(error.message, 'Invalid authentication information (no `strategy` set)') - } - }) - - it('fails when entity service was not found', async () => { - delete app.services.users - - await assert.rejects( - () => - app.service('protected').get('test', { - provider: 'rest', - authentication: { - strategy: 'jwt', - accessToken - } - }), - { - message: "Can not find service 'users'" - } - ) - }) - - it('fails when accessToken is not set', async () => { - try { - await app.service('protected').get('test', { - provider: 'rest', - authentication: { - strategy: 'jwt' - } - }) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotAuthenticated') - assert.strictEqual(error.message, 'No access token') - } - }) - - it('passes when authentication is set and merges params', async () => { - const params = { - provider: 'rest', - authentication: { - strategy: 'jwt', - accessToken - } - } - - const result = await app.service('protected').get('test', params) - - assert.strictEqual(Object.keys(result.params).length, 4) - assert.ok(!result.params.accessToken, 'Did not merge accessToken') - assert.deepStrictEqual(result, { - id: 'test', - params: merge({}, params, { - user, - authentication: { payload }, - authenticated: true - }) - }) - }) - - it('works with entity set to null', async () => { - const params = { - provider: 'rest', - authentication: { - strategy: 'jwt', - accessToken - } - } - - app.get('authentication').entity = null - - const result = await app.service('protected').get('test', params) - - assert.strictEqual(Object.keys(result.params).length, 3) - assert.ok(!result.params.accessToken, 'Did not merge accessToken') - assert.deepStrictEqual(result, { - id: 'test', - params: merge({}, params, { - authentication: { payload }, - authenticated: true - }) - }) - }) - }) - - describe('on authentication service', () => { - it('authenticates but does not return a new accessToken', async () => { - const authResult = await app.service('authentication').create({ - strategy: 'jwt', - accessToken - }) - - assert.strictEqual(authResult.accessToken, accessToken) - assert.deepStrictEqual(authResult.user, user) - assert.deepStrictEqual(authResult.authentication.payload, payload) - }) - - it('errors when trying to set invalid option', () => { - app.get('authentication').otherJwt = { - expiresIn: 'something' - } - - try { - app.service('authentication').register('otherJwt', new JWTStrategy()) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual( - error.message, - "Invalid JwtStrategy option 'authentication.otherJwt.expiresIn'. Did you mean to set it in 'authentication.jwtOptions'?" - ) - } - }) - - it('errors when `header` option is an object`', () => { - app.get('authentication').otherJwt = { - header: { message: 'This is wrong' } - } - - assert.throws(() => app.service('authentication').register('otherJwt', new JWTStrategy()), { - message: "The 'header' option for the otherJwt strategy must be a string" - }) - }) - }) - - describe('parse', () => { - const res = {} as ServerResponse - - it('returns null when header not set', async () => { - const req = {} as MockRequest - - const result = await app.service('authentication').parse(req, res, 'jwt') - - assert.strictEqual(result, null) - }) - - it('parses plain Authorization header', async () => { - const req = { - headers: { - authorization: accessToken - } - } as MockRequest - - const result = await app.service('authentication').parse(req, res, 'jwt') - - assert.deepStrictEqual(result, { - strategy: 'jwt', - accessToken - }) - }) - - it('parses Authorization header with Bearer scheme', async () => { - const req = { - headers: { - authorization: ` Bearer ${accessToken} ` - } - } as MockRequest - - const result = await app.service('authentication').parse(req, res, 'jwt') - - assert.deepStrictEqual(result, { - strategy: 'jwt', - accessToken - }) - }) - - it('return null when scheme does not match', async () => { - const req = { - headers: { - authorization: ' Basic something' - } - } as MockRequest - - const result = await app.service('authentication').parse(req, res, 'jwt') - - assert.strictEqual(result, null) - }) - }) -}) diff --git a/packages/authentication/test/service.test.ts b/packages/authentication/test/service.test.ts deleted file mode 100644 index 3594822bba..0000000000 --- a/packages/authentication/test/service.test.ts +++ /dev/null @@ -1,322 +0,0 @@ -/* eslint-disable @typescript-eslint/ban-ts-comment */ -import assert from 'assert' -import omit from 'lodash/omit' -import jwt from 'jsonwebtoken' -import { feathers, Application } from '@feathersjs/feathers' -import { memory, MemoryService } from '@feathersjs/memory' - -import { defaultOptions } from '../src/options' -import { AuthenticationService } from '../src' - -import { Strategy1 } from './fixtures' - -const UUID = /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/ - -describe('authentication/service', () => { - const message = 'Some payload' - - let app: Application<{ - authentication: AuthenticationService - users: MemoryService - }> - - beforeEach(() => { - app = feathers() - app.use( - 'authentication', - new AuthenticationService(app, 'authentication', { - entity: 'user', - service: 'users', - secret: 'supersecret', - authStrategies: ['first'] - }) - ) - app.use('users', memory()) - - app.service('authentication').register('first', new Strategy1()) - }) - - it('settings returns authentication options', () => { - assert.deepStrictEqual( - app.service('authentication').configuration, - Object.assign({}, defaultOptions, app.get('authentication')) - ) - }) - - it('app.defaultAuthentication()', () => { - assert.strictEqual(app.defaultAuthentication(), app.service('authentication')) - assert.throws(() => app.defaultAuthentication('dummy'), { - message: "Can not find service 'dummy'" - }) - }) - - describe('create', () => { - it('creates a valid accessToken and includes strategy result', async () => { - const service = app.service('authentication') - const result = await service.create({ - strategy: 'first', - username: 'David' - }) - - const settings = service.configuration.jwtOptions - const decoded = jwt.decode(result.accessToken) - - if (typeof decoded === 'string') { - throw new Error('Unexpected decoded JWT type') - } - - assert.ok(result.accessToken) - assert.deepStrictEqual(omit(result, 'accessToken', 'authentication'), Strategy1.result) - assert.deepStrictEqual(result.authentication.payload, decoded) - assert.ok(UUID.test(decoded.jti), 'Set `jti` to default UUID') - assert.strictEqual(decoded.aud, settings.audience) - assert.strictEqual(decoded.iss, settings.issuer) - }) - - it('fails when strategy fails', async () => { - try { - await app.service('authentication').create({ - strategy: 'first', - username: 'Dave' - }) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotAuthenticated') - assert.strictEqual(error.message, 'Invalid Dave') - } - }) - - it('creates a valid accessToken with strategy and params.payload', async () => { - const result = await app.service('authentication').create( - { - strategy: 'first', - username: 'David' - }, - { - payload: { message } - } - ) - - const decoded = jwt.decode(result.accessToken) - - if (typeof decoded === 'string') { - throw new Error('Unexpected decoded JWT type') - } - - assert.strictEqual(decoded.message, message) - }) - - it('sets the subject authResult[entity][entityService.id]', async () => { - const { accessToken } = await app.service('authentication').create({ - strategy: 'first', - username: 'David' - }) - - const decoded = jwt.decode(accessToken) - - assert.strictEqual(decoded.sub, Strategy1.result.user.id.toString()) - }) - - it('sets the subject authResult[entity][entityId]', async () => { - app.get('authentication').entityId = 'name' - - const { accessToken } = await app.service('authentication').create({ - strategy: 'first', - username: 'David' - }) - - const decoded = jwt.decode(accessToken) - - assert.strictEqual(decoded.sub, Strategy1.result.user.name.toString()) - }) - - it('does not override the subject if already set', async () => { - const subject = 'Davester' - - const { accessToken } = await app.service('authentication').create( - { - strategy: 'first', - username: 'David' - }, - { - jwt: { subject } - } - ) - - const decoded = jwt.decode(accessToken) - - assert.strictEqual(decoded.sub, subject) - }) - - it('errors when subject can not be found', async () => { - // @ts-ignore - app.service('users').options.id = 'somethingElse' - - try { - await app.service('authentication').create({ - strategy: 'first', - username: 'David' - }) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotAuthenticated') - assert.strictEqual(error.message, 'Can not set subject from user.somethingElse') - } - }) - - it('errors when no allowed strategies are set', async () => { - const service = app.service('authentication') - const configuration = service.configuration - - delete configuration.authStrategies - - app.set('authentication', configuration) - - try { - await service.create({ - strategy: 'first', - username: 'Dave' - }) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotAuthenticated') - assert.strictEqual( - error.message, - 'No authentication strategies allowed for creating a JWT (`authStrategies`)' - ) - } - }) - }) - - describe('remove', () => { - it('can remove with authentication strategy set', async () => { - const authResult = await app.service('authentication').remove(null, { - authentication: { - strategy: 'first', - username: 'David' - } - }) - - assert.deepStrictEqual(authResult, Strategy1.result) - }) - - it('passes when id is set and matches accessToken', async () => { - const authResult = await app.service('authentication').remove('test', { - authentication: { - strategy: 'first', - username: 'David', - accessToken: 'test' - } - }) - - assert.deepStrictEqual(authResult, Strategy1.result) - }) - - it('fails when id is set and does not match accessToken', async () => { - await assert.rejects( - () => - app.service('authentication').remove('test', { - authentication: { - strategy: 'first', - username: 'David', - accessToken: 'testing' - } - }), - { - name: 'NotAuthenticated', - message: 'Invalid access token' - } - ) - }) - - it('errors when trying to remove with nothing', async () => { - try { - await app.service('authentication').remove(null) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.message, 'Invalid authentication information (no `strategy` set)') - } - }) - }) - - describe('setup', () => { - it('errors when there is no secret', async () => { - delete app.get('authentication').secret - - await assert.rejects(() => app.setup(), { - message: "A 'secret' must be provided in your authentication configuration" - }) - }) - - it('throws an error if service name is not set', async () => { - const otherApp = feathers() - - otherApp.use( - '/authentication', - new AuthenticationService(otherApp, 'authentication', { - secret: 'supersecret', - authStrategies: ['first'] - }) - ) - - await assert.rejects(() => otherApp.setup(), { - message: "The 'service' option is not set in the authentication configuration" - }) - }) - - it('throws an error if entity service does not exist', async () => { - const otherApp = feathers() - - otherApp.use( - '/authentication', - new AuthenticationService(otherApp, 'authentication', { - entity: 'user', - service: 'users', - secret: 'supersecret', - authStrategies: ['first'] - }) - ) - - await assert.rejects(() => otherApp.setup(), { - message: "Can not find service 'users'" - }) - }) - - it('throws an error if entity service exists but has no `id`', async () => { - const otherApp = feathers() - - otherApp.use( - '/authentication', - new AuthenticationService(otherApp, 'authentication', { - entity: 'user', - service: 'users', - secret: 'supersecret', - strategies: ['first'] - }) - ) - - otherApp.use('/users', { - async get() { - return {} - } - }) - - await assert.rejects(() => otherApp.setup(), { - message: "The 'users' service does not have an 'id' property and no 'entityId' option is set." - }) - }) - - it('passes when entity service exists and `entityId` property is set', () => { - app.get('authentication').entityId = 'id' - app.use('users', memory()) - - app.setup() - }) - - it('does nothing when `entity` is explicitly `null`', () => { - app.get('authentication').entity = null - - app.setup() - }) - }) -}) diff --git a/packages/authentication/tsconfig.json b/packages/authentication/tsconfig.json deleted file mode 100644 index 316fd41336..0000000000 --- a/packages/authentication/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig", - "include": [ - "src/**/*.ts" - ], - "compilerOptions": { - "outDir": "lib" - } -} diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md deleted file mode 100644 index 47c16929d0..0000000000 --- a/packages/cli/CHANGELOG.md +++ /dev/null @@ -1,300 +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.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/cli - -## [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/cli - -## [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/cli - -## [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/cli - -## [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/cli - -## [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/cli - -## [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/cli - -## [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/cli - -## [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/cli - -## [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/cli - -## [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/cli - -## [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 @feathersjs/cli - -## [5.0.17](https://github.com/feathersjs/feathers/compare/v5.0.16...v5.0.17) (2024-01-22) - -### Bug Fixes - -- **cli:** Fix another ES module issue ([#3395](https://github.com/feathersjs/feathers/issues/3395)) ([8e39884](https://github.com/feathersjs/feathers/commit/8e39884a23d0e7868546dce4f7a3ee6e954c2b31)) - -## [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/cli - -## [5.0.15](https://github.com/feathersjs/feathers/compare/v5.0.14...v5.0.15) (2024-01-22) - -### Bug Fixes - -- **generators:** Move generators and CLI to featherscloud/pinion ([#3386](https://github.com/feathersjs/feathers/issues/3386)) ([eb87c99](https://github.com/feathersjs/feathers/commit/eb87c9922db56c5610e5b808f3ffe033c830e2b2)) - -## [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/cli - -## [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/cli - -## [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/cli - -## [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/cli - -## [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/cli - -## [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/cli - -## [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/cli - -## [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/cli - -## [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/cli - -## [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.2](https://github.com/feathersjs/feathers/compare/v5.0.1...v5.0.2) (2023-03-23) - -**Note:** Version bump only for package @feathersjs/cli - -## [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/cli - -# [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/cli - -# [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 @feathersjs/cli - -# [5.0.0-pre.36](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.35...v5.0.0-pre.36) (2023-01-29) - -### Bug Fixes - -- Update all dependencies ([#3024](https://github.com/feathersjs/feathers/issues/3024)) ([283dc47](https://github.com/feathersjs/feathers/commit/283dc4798d85584bc031e6e54b83b4ea77d1edd0)) - -# [5.0.0-pre.35](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.34...v5.0.0-pre.35) (2023-01-12) - -### Bug Fixes - -- **cli:** Add unhandledRejection handler to generated index file ([#2932](https://github.com/feathersjs/feathers/issues/2932)) ([e3cedc8](https://github.com/feathersjs/feathers/commit/e3cedc8e00f52d892f21fd6a3eb4ca4fe40a903c)) -- **cli:** Minor generated app improvements ([#2936](https://github.com/feathersjs/feathers/issues/2936)) ([ba1a550](https://github.com/feathersjs/feathers/commit/ba1a5500a8a5ea4ab44da44ac509e48c723d7efd)) -- **cli:** Properly log validation errors in log-error hook ([54c883c](https://github.com/feathersjs/feathers/commit/54c883c2bb5c35c02b1a2081b2f17554550aa1d4)) -- **cli:** Use correct package manager when installing an app ([#2973](https://github.com/feathersjs/feathers/issues/2973)) ([99c2a70](https://github.com/feathersjs/feathers/commit/99c2a70b77f0b68698a66180b69a56cb20c2ca0d)) - -### 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) - -### Bug Fixes - -- **cli:** mongodb connection string for node 17+ ([#2875](https://github.com/feathersjs/feathers/issues/2875)) ([7fa2012](https://github.com/feathersjs/feathers/commit/7fa2012897d8429b522fbca72211fc9be1c25f7e)) - -### Features - -- **adapter:** Add patch data type to adapters and refactor AdapterBase usage ([#2906](https://github.com/feathersjs/feathers/issues/2906)) ([9ddc2e6](https://github.com/feathersjs/feathers/commit/9ddc2e6b028f026f939d6af68125847e5c6734b4)) -- **cli:** Use separate patch schema and types ([#2916](https://github.com/feathersjs/feathers/issues/2916)) ([7088af6](https://github.com/feathersjs/feathers/commit/7088af64a539dc7f1a016d832b77b98aaaf92603)) -- **docs:** CLI and application structure guide ([#2818](https://github.com/feathersjs/feathers/issues/2818)) ([142914f](https://github.com/feathersjs/feathers/commit/142914fc001a8420056dd56db992c1c4f1bd312c)) -- **schema:** Split resolver options and property resolvers ([#2889](https://github.com/feathersjs/feathers/issues/2889)) ([4822c94](https://github.com/feathersjs/feathers/commit/4822c949812e5a1dceff3c62b2f9de4781b4d601)) -- **schema:** Virtual property resolvers ([#2900](https://github.com/feathersjs/feathers/issues/2900)) ([7d03b57](https://github.com/feathersjs/feathers/commit/7d03b57ae2f633bdd4a368e0d5955011fbd6c329)) - -# [5.0.0-pre.33](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.32...v5.0.0-pre.33) (2022-11-08) - -### Bug Fixes - -- **cli:** Fix MongoDB connection database name parsing ([#2845](https://github.com/feathersjs/feathers/issues/2845)) ([50e7463](https://github.com/feathersjs/feathers/commit/50e7463971ef95cb98358b70a721e67554d92eb5)) -- **cli:** Use proper MSSQL client ([#2853](https://github.com/feathersjs/feathers/issues/2853)) ([bae5176](https://github.com/feathersjs/feathers/commit/bae5176488b46fc377e53719d20e0036e087aa16)) -- **docs:** Add JavaScript web app frontend guide ([#2834](https://github.com/feathersjs/feathers/issues/2834)) ([68cf03f](https://github.com/feathersjs/feathers/commit/68cf03f092da38ccbec5e9fd42b95d00f5a0a9f2)) - -### Features - -- **mongodb:** Add ObjectId resolvers and MongoDB option in the guide ([#2847](https://github.com/feathersjs/feathers/issues/2847)) ([c5c1fba](https://github.com/feathersjs/feathers/commit/c5c1fba5718a63412075cd3838b86b889eb0bd48)) - -# [5.0.0-pre.32](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.31...v5.0.0-pre.32) (2022-10-26) - -### Bug Fixes - -- **cli:** Ensure code injection points are not code style dependent ([#2832](https://github.com/feathersjs/feathers/issues/2832)) ([0776e26](https://github.com/feathersjs/feathers/commit/0776e26bfe4c1df9d2786499941bd3faba1715c0)) -- **cli:** Only generate authentication setup when selected ([#2823](https://github.com/feathersjs/feathers/issues/2823)) ([7d219d9](https://github.com/feathersjs/feathers/commit/7d219d9c5269267b50f3ce99a5653d645f9927c1)) -- **docs:** Review transport API docs and update Express middleware setup ([#2811](https://github.com/feathersjs/feathers/issues/2811)) ([1b97f14](https://github.com/feathersjs/feathers/commit/1b97f14d474f5613482f259eeaa585c24fcfab43)) -- **transports:** Add remaining middleware for generated apps to Koa and Express ([#2796](https://github.com/feathersjs/feathers/issues/2796)) ([0d5781a](https://github.com/feathersjs/feathers/commit/0d5781a5c72a0cbb2ec8211bfa099f0aefe115a2)) - -### Features - -- **cli:** Add authentication client to generated client ([#2801](https://github.com/feathersjs/feathers/issues/2801)) ([bd59f91](https://github.com/feathersjs/feathers/commit/bd59f91b45a01c2eea0c4386e567f4de5aa6ad99)) - -# [5.0.0-pre.31](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.30...v5.0.0-pre.31) (2022-10-12) - -### Features - -- **cli:** Generate full client test suite and improve typed client ([#2788](https://github.com/feathersjs/feathers/issues/2788)) ([57119b6](https://github.com/feathersjs/feathers/commit/57119b6bb2797f7297cf054268a248c093ecd538)) -- **cli:** Improve generated schema definitions ([#2783](https://github.com/feathersjs/feathers/issues/2783)) ([474a9fd](https://github.com/feathersjs/feathers/commit/474a9fda2107e9bcf357746320a8e00cda8182b6)) - -# [5.0.0-pre.30](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.29...v5.0.0-pre.30) (2022-10-07) - -### Bug Fixes - -- **core:** Ensure setup and teardown can be overriden and maintain hook functionality ([#2779](https://github.com/feathersjs/feathers/issues/2779)) ([ab580cb](https://github.com/feathersjs/feathers/commit/ab580cbcaa68d19144d86798c13bf564f9d424a6)) - -### Features - -- **cli:** Add ability to `npm init feathers` ([#2755](https://github.com/feathersjs/feathers/issues/2755)) ([d734931](https://github.com/feathersjs/feathers/commit/d734931ffd4f983a05d9e771ce0e43b696c2bc0e)) -- **cli:** Improve CLI interface ([#2753](https://github.com/feathersjs/feathers/issues/2753)) ([c7e1b7e](https://github.com/feathersjs/feathers/commit/c7e1b7e80aacb84441908c3d73512d9cf7557f7e)) -- **core:** Allow to unregister services at runtime ([#2756](https://github.com/feathersjs/feathers/issues/2756)) ([d16601f](https://github.com/feathersjs/feathers/commit/d16601f2277dca5357866ffdefba2a611f6dc7fa)) -- **schema:** Make schemas validation library independent and add TypeBox support ([#2772](https://github.com/feathersjs/feathers/issues/2772)) ([44172d9](https://github.com/feathersjs/feathers/commit/44172d99b566d11d9ceda04f1d0bf72b6d05ce76)) - -# [5.0.0-pre.29](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.28...v5.0.0-pre.29) (2022-09-16) - -### Features - -- Add CORS support to oAuth, Express, Koa and generated application ([#2744](https://github.com/feathersjs/feathers/issues/2744)) ([fd218f2](https://github.com/feathersjs/feathers/commit/fd218f289f8ca4c101e9938e8683e2efef6e8131)) -- **authentication-oauth:** Koa and transport independent oAuth authentication ([#2737](https://github.com/feathersjs/feathers/issues/2737)) ([9231525](https://github.com/feathersjs/feathers/commit/9231525a24bb790ba9c5d940f2867a9c727691c9)) -- **cli:** Add custom environment variable support to generated application ([#2751](https://github.com/feathersjs/feathers/issues/2751)) ([c7bf80d](https://github.com/feathersjs/feathers/commit/c7bf80d82c28c190e3f0136d51af5b7de1bc4868)) -- **cli:** Adding ClientService to CLI ([#2750](https://github.com/feathersjs/feathers/issues/2750)) ([1d45427](https://github.com/feathersjs/feathers/commit/1d45427988521ac028755cbe128685fcdf34f636)) - -# [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) - -### Bug Fixes - -- **cli:** Fix flaky authentication migration and SQL id schema types ([#2676](https://github.com/feathersjs/feathers/issues/2676)) ([04ce9a5](https://github.com/feathersjs/feathers/commit/04ce9a53f4226cd6283f9dc241876e90ddf48618)) - -### Features - -- **cli:** Add support for Prettier ([#2684](https://github.com/feathersjs/feathers/issues/2684)) ([83aa8f9](https://github.com/feathersjs/feathers/commit/83aa8f9f212cb122d831dca8858852b0ac9b4da8)) -- **cli:** Improve generated application folder structure ([#2678](https://github.com/feathersjs/feathers/issues/2678)) ([d114557](https://github.com/feathersjs/feathers/commit/d114557721e73d6302aa88c11e3726dbcbd5c92b)) - -# [5.0.0-pre.26](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.25...v5.0.0-pre.26) (2022-06-22) - -### Bug Fixes - -- **cli:** Fix compilation folders that got mixed up ([fc4cb74](https://github.com/feathersjs/feathers/commit/fc4cb742f7f9164096d9319b13dfaaa5f54686a6)) - -# [5.0.0-pre.25](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.24...v5.0.0-pre.25) (2022-06-22) - -### Bug Fixes - -- **cli:** Generator fixes to work with the new guide ([#2674](https://github.com/feathersjs/feathers/issues/2674)) ([b773fa5](https://github.com/feathersjs/feathers/commit/b773fa5dbd7ff450cfb2f7b93e64882592262712)) - -# [5.0.0-pre.24](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.23...v5.0.0-pre.24) (2022-06-21) - -### Features - -- **cli:** Add generators for new Knex SQL database adapter ([#2673](https://github.com/feathersjs/feathers/issues/2673)) ([0fb2c0f](https://github.com/feathersjs/feathers/commit/0fb2c0f629116f71184b8698c383af8cfd149688)) -- **cli:** Add hook generator ([#2667](https://github.com/feathersjs/feathers/issues/2667)) ([24e4bc0](https://github.com/feathersjs/feathers/commit/24e4bc04a67fadee0e6a96a8389d788faba5c305)) -- **cli:** Add support for JavaScript to the new CLI ([#2668](https://github.com/feathersjs/feathers/issues/2668)) ([ebac587](https://github.com/feathersjs/feathers/commit/ebac587f7d00dc7607c3f546352d79f79b89a5d4)) -- **cli:** Add typed client to a generated app ([#2669](https://github.com/feathersjs/feathers/issues/2669)) ([5b801b5](https://github.com/feathersjs/feathers/commit/5b801b5017ddc3eaa95622b539f51d605916bc86)) -- **cli:** Initial Feathers v5 CLI and Pinion generator ([#2578](https://github.com/feathersjs/feathers/issues/2578)) ([7f59ae7](https://github.com/feathersjs/feathers/commit/7f59ae7f1471895ba8a82aa4702f1a23f71b7682)) diff --git a/packages/cli/LICENSE b/packages/cli/LICENSE deleted file mode 100644 index 7839c824d7..0000000000 --- a/packages/cli/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2024 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 -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -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/cli/README.md b/packages/cli/README.md deleted file mode 100644 index 3b99960ca6..0000000000 --- a/packages/cli/README.md +++ /dev/null @@ -1,28 +0,0 @@ -# @feathersjs/cli - -[![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/cli.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/cli) - -> The command line interface for creating Feathers applications - -## Installation - -``` -npm install @feathersjs/cli --save-dev -``` - -## Usage - -``` -$ npx feathers help -``` - -## Documentation - -Refer to the [Feathers CLI guide](https://feathersjs.com/guides/cli/) 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/cli/bin/feathers.js b/packages/cli/bin/feathers.js deleted file mode 100755 index 4e3cf79743..0000000000 --- a/packages/cli/bin/feathers.js +++ /dev/null @@ -1,6 +0,0 @@ -#!/usr/bin/env node -'use strict' - -import { program } from '../lib/index.js' - -program.parse() diff --git a/packages/cli/package.json b/packages/cli/package.json deleted file mode 100644 index 8ae5716532..0000000000 --- a/packages/cli/package.json +++ /dev/null @@ -1,89 +0,0 @@ -{ - "name": "@feathersjs/cli", - "description": "The command line interface for creating Feathers applications", - "version": "5.0.34", - "homepage": "https://feathersjs.com", - "main": "lib/index.js", - "type": "module", - "bin": { - "feathers": "./bin/feathers.js" - }, - "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": ">= 14" - }, - "files": [ - "CHANGELOG.md", - "LICENSE", - "README.md", - "lib/**", - "lib/app/static/.gitignore", - "bin/**", - "*.d.ts", - "*.js" - ], - "scripts": { - "prepublish": "npm run compile", - "compile": "shx rm -rf lib/ && tsc", - "mocha": "mocha --timeout 60000 --config ../../.mocharc.json --require tsx --recursive test/**.test.ts test/**/*.test.ts", - "test": "npm run compile && npm run mocha && bin/feathers.js --help" - }, - "publishConfig": { - "access": "public" - }, - "dependencies": { - "@feathersjs/generators": "^5.0.34", - "chalk": "^5.4.1", - "commander": "^13.1.0" - }, - "devDependencies": { - "@feathersjs/adapter-commons": "^5.0.34", - "@feathersjs/authentication": "^5.0.34", - "@feathersjs/authentication-client": "^5.0.34", - "@feathersjs/authentication-local": "^5.0.34", - "@feathersjs/authentication-oauth": "^5.0.34", - "@feathersjs/configuration": "^5.0.34", - "@feathersjs/errors": "^5.0.34", - "@feathersjs/express": "^5.0.34", - "@feathersjs/feathers": "^5.0.34", - "@feathersjs/knex": "^5.0.34", - "@feathersjs/koa": "^5.0.34", - "@feathersjs/mongodb": "^5.0.34", - "@feathersjs/rest-client": "^5.0.34", - "@feathersjs/schema": "^5.0.34", - "@feathersjs/socketio": "^5.0.34", - "@feathersjs/transport-commons": "^5.0.34", - "@feathersjs/typebox": "^5.0.34", - "@types/mocha": "^10.0.10", - "@types/node": "^24.1.0", - "@types/prettier": "^2.7.3", - "axios": "^1.11.0", - "mocha": "^11.7.1", - "shx": "^0.4.0", - "ts-node": "^10.9.2", - "type-fest": "^4.41.0", - "typescript": "^5.9.2" - }, - "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" -} diff --git a/packages/cli/src/index.ts b/packages/cli/src/index.ts deleted file mode 100644 index 50263fc9f9..0000000000 --- a/packages/cli/src/index.ts +++ /dev/null @@ -1,72 +0,0 @@ -import chalk from 'chalk' -import { Command } from 'commander' -import { dirname } from 'path' -import { runGenerator, getContext, FeathersBaseContext, version } from '@feathersjs/generators' -import { createRequire } from 'node:module' - -export * from 'commander' -export { chalk } - -const require = createRequire(import.meta.url) - -export const commandRunner = (name: string) => async (options: any) => { - const folder = dirname(require.resolve('@feathersjs/generators')) - const ctx = getContext({ - ...options - }) - - await Promise.resolve(ctx) - .then(runGenerator(folder, name, 'index.js')) - .catch((error) => { - const { logger } = ctx.pinion - - logger.error(`Error: ${chalk.white(error.message)}`) - }) -} - -export const program = new Command() - -program - .name('feathers') - .description('The Feathers command line interface 🕊️') - .version(version) - .showHelpAfterError() - -const generate = program.command('generate').alias('g') - -generate - .command('app') - .description('Generate a new application') - .option('--name ', 'The name of the application') - .action(commandRunner('app')) - -generate - .command('service') - .description('Generate a new service') - .option('--name ', 'The service name') - .option('--path ', 'The path to register the service on') - .option('--type ', 'The service type (knex, mongodb, custom)') - .action(commandRunner('service')) - -generate - .command('hook') - .description('Generate a hook') - .option('--name ', 'The name of the hook') - .option('--type ', 'The hook type (around or regular)') - .action(commandRunner('hook')) - -generate - .command('connection') - .description('Add a new database connection') - .action(commandRunner('connection')) - -generate - .command('authentication') - .description('Add authentication to the application') - .action(commandRunner('authentication')) - -generate.description( - `Run a generator. Currently available: \n ${generate.commands - .map((cmd) => `${chalk.blue(cmd.name())}: ${cmd.description()} `) - .join('\n ')}` -) diff --git a/packages/cli/test/cli.test.ts b/packages/cli/test/cli.test.ts deleted file mode 100644 index afd1a14473..0000000000 --- a/packages/cli/test/cli.test.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { strict } from 'assert' -import { program } from '../src' - -describe('cli tests', () => { - it('exports the program', async () => { - strict.ok(program) - }) -}) diff --git a/packages/cli/tsconfig.json b/packages/cli/tsconfig.json deleted file mode 100644 index e7a844ccb1..0000000000 --- a/packages/cli/tsconfig.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "../../tsconfig", - "include": [ - "src/**/*.ts" - ], - "compilerOptions": { - "outDir": "lib", - "module": "ESNext", - "moduleResolution": "Node" - } -} diff --git a/packages/client/CHANGELOG.md b/packages/client/CHANGELOG.md deleted file mode 100644 index 95f2926cab..0000000000 --- a/packages/client/CHANGELOG.md +++ /dev/null @@ -1,1380 +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.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/client - -## [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/client - -## [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/client - -## [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/client - -## [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/client - -## [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/client - -## [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/client - -## [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/client - -## [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/client - -## [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/client - -## [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/client - -## [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/client - -## [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/client - -## [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/client - -## [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/client - -## [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/client - -## [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/client - -## [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/client - -## [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/client - -## [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/client - -## [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/client - -## [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/client - -## [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/client - -## [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/client - -## [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/client - -## [5.0.4](https://github.com/feathersjs/feathers/compare/v5.0.3...v5.0.4) (2023-04-12) - -**Note:** Version bump only for package @feathersjs/client - -## [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.2](https://github.com/feathersjs/feathers/compare/v5.0.1...v5.0.2) (2023-03-23) - -**Note:** Version bump only for package @feathersjs/client - -## [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/client - -# [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/client - -# [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/client - -# [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/client - -# [5.0.0-pre.36](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.35...v5.0.0-pre.36) (2023-01-29) - -### Bug Fixes - -- Update all dependencies ([#3024](https://github.com/feathersjs/feathers/issues/3024)) ([283dc47](https://github.com/feathersjs/feathers/commit/283dc4798d85584bc031e6e54b83b4ea77d1edd0)) - -# [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 @feathersjs/client - -# [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/client - -# [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/client - -# [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/client - -# [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 @feathersjs/client - -# [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/client - -# [5.0.0-pre.28](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.27...v5.0.0-pre.28) (2022-08-03) - -**Note:** Version bump only for package @feathersjs/client - -# [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/client - -# [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/client - -# [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/client - -# [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/client - -# [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/client - -# [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/client - -# [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/client - -# [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) - -### Bug Fixes - -- **client:** Fix @feathersjs/client types field ([#2596](https://github.com/feathersjs/feathers/issues/2596)) ([d719f54](https://github.com/feathersjs/feathers/commit/d719f54daee63daf9ed5cc762626ca15131086de)) - -### Features - -- **typescript:** Improve adapter typings ([#2605](https://github.com/feathersjs/feathers/issues/2605)) ([3b2ca0a](https://github.com/feathersjs/feathers/commit/3b2ca0a6a8e03e8390272c4d7e930b4bffdaacf5)) - -# [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/client - -# [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/client - -# [5.0.0-pre.16](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.15...v5.0.0-pre.16) (2022-01-12) - -### Features - -- **express, koa:** make transports similar ([#2486](https://github.com/feathersjs/feathers/issues/2486)) ([26aa937](https://github.com/feathersjs/feathers/commit/26aa937c114fb8596dfefc599b1f53cead69c159)) - -# [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/client - -# [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/client - -# [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/client - -# [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/client - -# [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/client - -# [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/client - -# [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/client - -# [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/client - -# [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/client - -# [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/client - -# [5.0.0-pre.5](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.4...v5.0.0-pre.5) (2021-06-23) - -### Features - -- **adapter-commons:** Add support for params.adapter option and move memory adapter to @feathersjs/memory ([#2367](https://github.com/feathersjs/feathers/issues/2367)) ([a43e7da](https://github.com/feathersjs/feathers/commit/a43e7da22b6b981a96d1321736ea9a0cb924fb4f)) - -# [5.0.0-pre.4](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.3...v5.0.0-pre.4) (2021-05-13) - -### Features - -- **koa:** KoaJS transport adapter ([#2315](https://github.com/feathersjs/feathers/issues/2315)) ([2554b57](https://github.com/feathersjs/feathers/commit/2554b57cf05731df58feeba9c12faab18e442107)) - -# [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/client - -# [5.0.0-beta.1](https://github.com/feathersjs/feathers/compare/v5.0.0-beta.0...v5.0.0-beta.1) (2021-04-03) - -### Bug Fixes - -- **dependencies:** Fix transport-commons dependency and update other dependencies ([#2284](https://github.com/feathersjs/feathers/issues/2284)) ([05b03b2](https://github.com/feathersjs/feathers/commit/05b03b27b40604d956047e3021d8053c3a137616)) - -# [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)) - -### Features - -- Feathers v5 core refactoring and features ([#2255](https://github.com/feathersjs/feathers/issues/2255)) ([2dafb7c](https://github.com/feathersjs/feathers/commit/2dafb7ce14ba57406aeec13d10ca45b1e709bee9)) - -# [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) - -### chore - -- **package:** Remove @feathersjs/primus packages from core ([#1919](https://github.com/feathersjs/feathers/issues/1919)) ([d20b7d5](https://github.com/feathersjs/feathers/commit/d20b7d5a70f4d3306e294696156e8aa0337c35e9)), closes [#1899](https://github.com/feathersjs/feathers/issues/1899) - -### Features - -- **core:** use @feathers/hooks and add async type ([#1929](https://github.com/feathersjs/feathers/issues/1929)) ([a5c4756](https://github.com/feathersjs/feathers/commit/a5c47562eae8410c82fe2f6308f26f8e78b6a3e8)) - -### BREAKING CHANGES - -- **package:** Remove primus packages to be moved into the ecosystem. - -# [5.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v4.5.4...v5.0.0-pre.0) (2020-05-19) - -### chore - -- **package:** Remove @feathersjs/primus packages from core ([#1919](https://github.com/feathersjs/feathers/issues/1919)) ([d20b7d5](https://github.com/feathersjs/feathers/commit/d20b7d5a70f4d3306e294696156e8aa0337c35e9)), closes [#1899](https://github.com/feathersjs/feathers/issues/1899) - -### Features - -- **core:** use @feathers/hooks and add async type ([#1929](https://github.com/feathersjs/feathers/issues/1929)) ([a5c4756](https://github.com/feathersjs/feathers/commit/a5c47562eae8410c82fe2f6308f26f8e78b6a3e8)) - -### BREAKING CHANGES - -- **package:** Remove primus packages to be moved into the ecosystem. - -## [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/client - -## [4.5.10](https://github.com/feathersjs/feathers/compare/v4.5.9...v4.5.10) (2020-11-08) - -### Bug Fixes - -- **package:** Fix clean script in non Unix environments ([#2110](https://github.com/feathersjs/feathers/issues/2110)) ([09b62c0](https://github.com/feathersjs/feathers/commit/09b62c0c7e636caf620904ba87d61f168a020f05)) - -## [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/client - -## [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/client - -## [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/client - -## [4.5.6](https://github.com/feathersjs/feathers/compare/v4.5.5...v4.5.6) (2020-07-12) - -**Note:** Version bump only for package @feathersjs/client - -## [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/client - -## [4.5.4](https://github.com/feathersjs/feathers/compare/v4.5.3...v4.5.4) (2020-04-29) - -**Note:** Version bump only for package @feathersjs/client - -## [4.5.3](https://github.com/feathersjs/feathers/compare/v4.5.2...v4.5.3) (2020-04-17) - -**Note:** Version bump only for package @feathersjs/client - -## [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/client - -## [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/client - -# [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/client - -## [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/client - -## [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/client - -# [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/client - -## [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/client - -## [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/client - -## [4.3.9](https://github.com/feathersjs/feathers/compare/v4.3.8...v4.3.9) (2019-10-26) - -**Note:** Version bump only for package @feathersjs/client - -## [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/client - -## [4.3.5](https://github.com/feathersjs/feathers/compare/v4.3.4...v4.3.5) (2019-10-07) - -**Note:** Version bump only for package @feathersjs/client - -## [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/client - -## [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/client - -## [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/client - -## [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/client - -# [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/client - -# [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/client - -# [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/client - -# [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/client - -# [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/client - -# [4.0.0-pre.5](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.4...v4.0.0-pre.5) (2019-07-10) - -### Bug Fixes - -- Fix feathers-memory dependency that did not get updated ([9422b13](https://github.com/feathersjs/feathers/commit/9422b13)) - -# [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/client - -# [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 - -- Improve authentication parameter handling ([#1333](https://github.com/feathersjs/feathers/issues/1333)) ([6e77204](https://github.com/feathersjs/feathers/commit/6e77204)) - -# [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 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)) -- **chore:** Properly configure and run code linter ([#1092](https://github.com/feathersjs/feathers/issues/1092)) ([fd3fc34](https://github.com/feathersjs/feathers/commit/fd3fc34)) - -### 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.7.8](https://github.com/feathersjs/feathers/compare/@feathersjs/client@3.7.7...@feathersjs/client@3.7.8) (2019-01-26) - -**Note:** Version bump only for package @feathersjs/client - -## [3.7.7](https://github.com/feathersjs/feathers/compare/@feathersjs/client@3.7.6...@feathersjs/client@3.7.7) (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.7.6](https://github.com/feathersjs/feathers/compare/@feathersjs/client@3.7.5...@feathersjs/client@3.7.6) (2018-12-16) - -### Bug Fixes - -- **chore:** Properly configure and run code linter ([#1092](https://github.com/feathersjs/feathers/issues/1092)) ([fd3fc34](https://github.com/feathersjs/feathers/commit/fd3fc34)) - - - -## [3.7.5](https://github.com/feathersjs/feathers/compare/@feathersjs/client@3.7.4...@feathersjs/client@3.7.5) (2018-10-26) - -**Note:** Version bump only for package @feathersjs/client - - - -## [3.7.4](https://github.com/feathersjs/feathers/compare/@feathersjs/client@3.7.3...@feathersjs/client@3.7.4) (2018-10-25) - -### 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.7.3](https://github.com/feathersjs/feathers/compare/@feathersjs/client@3.7.2...@feathersjs/client@3.7.3) (2018-09-24) - -**Note:** Version bump only for package @feathersjs/client - - - -## 3.7.2 (2018-09-21) - -**Note:** Version bump only for package @feathersjs/client - -# Change Log - -## [v3.7.1](https://github.com/feathersjs/client/tree/v3.7.1) (2018-09-21) - -[Full Changelog](https://github.com/feathersjs/client/compare/v3.7.0...v3.7.1) - -## [v3.7.0](https://github.com/feathersjs/client/tree/v3.7.0) (2018-09-18) - -[Full Changelog](https://github.com/feathersjs/client/compare/v3.6.0...v3.7.0) - -**Closed issues:** - -- Cannot patch multiple items [\#267](https://github.com/feathersjs/client/issues/267) - -**Merged pull requests:** - -- Update all dependencies and build to Babel 8 [\#294](https://github.com/feathersjs/client/pull/294) ([daffl](https://github.com/daffl)) -- Update uglifyjs-webpack-plugin to the latest version 🚀 [\#287](https://github.com/feathersjs/client/pull/287) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) - -## [v3.6.0](https://github.com/feathersjs/client/tree/v3.6.0) (2018-09-03) - -[Full Changelog](https://github.com/feathersjs/client/compare/v3.5.6...v3.6.0) - -**Merged pull requests:** - -- Update all dependencies [\#285](https://github.com/feathersjs/client/pull/285) ([daffl](https://github.com/daffl)) -- Update all dependencies [\#278](https://github.com/feathersjs/client/pull/278) ([daffl](https://github.com/daffl)) -- Update @feathersjs/errors to the latest version 🚀 [\#272](https://github.com/feathersjs/client/pull/272) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) - -## [v3.5.6](https://github.com/feathersjs/client/tree/v3.5.6) (2018-08-13) - -[Full Changelog](https://github.com/feathersjs/client/compare/v3.5.5...v3.5.6) - -## [v3.5.5](https://github.com/feathersjs/client/tree/v3.5.5) (2018-08-02) - -[Full Changelog](https://github.com/feathersjs/client/compare/v3.5.4...v3.5.5) - -**Closed issues:** - -- IE11: TypeError: Object doesn't support property or method 'from' [\#270](https://github.com/feathersjs/client/issues/270) - -**Merged pull requests:** - -- Update ws to the latest version 🚀 [\#269](https://github.com/feathersjs/client/pull/269) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) - -## [v3.5.4](https://github.com/feathersjs/client/tree/v3.5.4) (2018-07-19) - -[Full Changelog](https://github.com/feathersjs/client/compare/v3.5.3...v3.5.4) - -**Merged pull requests:** - -- Update all dependencies to latest [\#268](https://github.com/feathersjs/client/pull/268) ([daffl](https://github.com/daffl)) - -## [v3.5.3](https://github.com/feathersjs/client/tree/v3.5.3) (2018-06-28) - -[Full Changelog](https://github.com/feathersjs/client/compare/v3.5.2...v3.5.3) - -**Merged pull requests:** - -- Update @feathersjs/rest-client to the latest version 🚀 [\#266](https://github.com/feathersjs/client/pull/266) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) - -## [v3.5.2](https://github.com/feathersjs/client/tree/v3.5.2) (2018-06-16) - -[Full Changelog](https://github.com/feathersjs/client/compare/v3.5.1...v3.5.2) - -**Closed issues:** - -- service times out when sending any request to the server, not on localhost [\#264](https://github.com/feathersjs/client/issues/264) - -**Merged pull requests:** - -- Update @feathersjs/feathers to the latest version 🚀 [\#265](https://github.com/feathersjs/client/pull/265) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) -- Update shx to the latest version 🚀 [\#263](https://github.com/feathersjs/client/pull/263) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) - -## [v3.5.1](https://github.com/feathersjs/client/tree/v3.5.1) (2018-06-03) - -[Full Changelog](https://github.com/feathersjs/client/compare/v3.5.0...v3.5.1) - -**Closed issues:** - -- 'exports' is undefined [\#261](https://github.com/feathersjs/client/issues/261) -- I got error from NuxtJS when I use FeathersJS client V3 [\#260](https://github.com/feathersjs/client/issues/260) - -**Merged pull requests:** - -- Update @feathersjs/feathers to the latest version 🚀 [\#262](https://github.com/feathersjs/client/pull/262) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) - -## [v3.5.0](https://github.com/feathersjs/client/tree/v3.5.0) (2018-05-17) - -[Full Changelog](https://github.com/feathersjs/client/compare/v3.4.5...v3.5.0) - -**Merged pull requests:** - -- Update @feathersjs/rest-client to the latest version 🚀 [\#259](https://github.com/feathersjs/client/pull/259) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) - -## [v3.4.5](https://github.com/feathersjs/client/tree/v3.4.5) (2018-05-04) - -[Full Changelog](https://github.com/feathersjs/client/compare/v3.4.4...v3.4.5) - -**Merged pull requests:** - -- Update @feathersjs/feathers to the latest version 🚀 [\#258](https://github.com/feathersjs/client/pull/258) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) - -## [v3.4.4](https://github.com/feathersjs/client/tree/v3.4.4) (2018-03-27) - -[Full Changelog](https://github.com/feathersjs/client/compare/v3.4.3...v3.4.4) - -**Merged pull requests:** - -- Update @feathersjs/feathers to the latest version 🚀 [\#257](https://github.com/feathersjs/client/pull/257) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) -- Update @feathersjs/rest-client to the latest version 🚀 [\#256](https://github.com/feathersjs/client/pull/256) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) - -## [v3.4.3](https://github.com/feathersjs/client/tree/v3.4.3) (2018-03-07) - -[Full Changelog](https://github.com/feathersjs/client/compare/v3.4.2...v3.4.3) - -**Closed issues:** - -- Can't capture event on client side [\#253](https://github.com/feathersjs/client/issues/253) - -**Merged pull requests:** - -- Update ws to the latest version 🚀 [\#255](https://github.com/feathersjs/client/pull/255) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) -- Update webpack to the latest version 🚀 [\#254](https://github.com/feathersjs/client/pull/254) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) - -## [v3.4.2](https://github.com/feathersjs/client/tree/v3.4.2) (2018-02-16) - -[Full Changelog](https://github.com/feathersjs/client/compare/v3.4.1...v3.4.2) - -**Closed issues:** - -- Feathers client now working with HTTPS self signed certs [\#250](https://github.com/feathersjs/client/issues/250) - -**Merged pull requests:** - -- Update @feathersjs/feathers to the latest version 🚀 [\#252](https://github.com/feathersjs/client/pull/252) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) -- Update @feathersjs/errors to the latest version 🚀 [\#251](https://github.com/feathersjs/client/pull/251) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) - -## [v3.4.1](https://github.com/feathersjs/client/tree/v3.4.1) (2018-02-10) - -[Full Changelog](https://github.com/feathersjs/client/compare/v3.4.0...v3.4.1) - -**Merged pull requests:** - -- Update @feathersjs/feathers to the latest version 🚀 [\#249](https://github.com/feathersjs/client/pull/249) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) - -## [v3.4.0](https://github.com/feathersjs/client/tree/v3.4.0) (2018-02-09) - -[Full Changelog](https://github.com/feathersjs/client/compare/v3.3.2...v3.4.0) - -**Merged pull requests:** - -- Update @feathersjs/primus-client to the latest version 🚀 [\#248](https://github.com/feathersjs/client/pull/248) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) -- Update @feathersjs/socketio-client to the latest version 🚀 [\#247](https://github.com/feathersjs/client/pull/247) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) - -## [v3.3.2](https://github.com/feathersjs/client/tree/v3.3.2) (2018-02-09) - -[Full Changelog](https://github.com/feathersjs/client/compare/v3.3.1...v3.3.2) - -**Merged pull requests:** - -- Update @feathersjs/feathers to the latest version 🚀 [\#246](https://github.com/feathersjs/client/pull/246) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) -- delete slack link [\#245](https://github.com/feathersjs/client/pull/245) ([vodniciarv](https://github.com/vodniciarv)) - -## [v3.3.1](https://github.com/feathersjs/client/tree/v3.3.1) (2018-02-05) - -[Full Changelog](https://github.com/feathersjs/client/compare/v3.3.0...v3.3.1) - -**Merged pull requests:** - -- Update @feathersjs/socketio-client to the latest version 🚀 [\#244](https://github.com/feathersjs/client/pull/244) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) -- Update @feathersjs/primus-client to the latest version 🚀 [\#243](https://github.com/feathersjs/client/pull/243) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) -- Update node-fetch to the latest version 🚀 [\#242](https://github.com/feathersjs/client/pull/242) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) - -## [v3.3.0](https://github.com/feathersjs/client/tree/v3.3.0) (2018-01-26) - -[Full Changelog](https://github.com/feathersjs/client/compare/v3.2.0...v3.3.0) - -**Merged pull requests:** - -- Update @feathersjs/feathers to the latest version 🚀 [\#241](https://github.com/feathersjs/client/pull/241) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) - -## [v3.2.0](https://github.com/feathersjs/client/tree/v3.2.0) (2018-01-24) - -[Full Changelog](https://github.com/feathersjs/client/compare/v3.1.2...v3.2.0) - -**Closed issues:** - -- Index.d.ts has a lack of return-type annotation [\#238](https://github.com/feathersjs/client/issues/238) -- feathers rest client call get but server execute find [\#237](https://github.com/feathersjs/client/issues/237) -- EventEmitter memory leak detected [\#236](https://github.com/feathersjs/client/issues/236) - -**Merged pull requests:** - -- Update @feathersjs/errors to the latest version 🚀 [\#240](https://github.com/feathersjs/client/pull/240) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) -- Update mocha to the latest version 🚀 [\#239](https://github.com/feathersjs/client/pull/239) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) -- Update ws to the latest version 🚀 [\#235](https://github.com/feathersjs/client/pull/235) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) -- Update @feathersjs/feathers to the latest version 🚀 [\#234](https://github.com/feathersjs/client/pull/234) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) -- Update @feathersjs/rest-client to the latest version 🚀 [\#233](https://github.com/feathersjs/client/pull/233) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) -- Update @feathersjs/feathers to the latest version 🚀 [\#232](https://github.com/feathersjs/client/pull/232) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) -- Update @feathersjs/authentication-client to the latest version 🚀 [\#231](https://github.com/feathersjs/client/pull/231) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) -- Update @feathersjs/socketio-client to the latest version 🚀 [\#230](https://github.com/feathersjs/client/pull/230) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) -- Update @feathersjs/primus-client to the latest version 🚀 [\#229](https://github.com/feathersjs/client/pull/229) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) -- Update @feathersjs/errors to the latest version 🚀 [\#228](https://github.com/feathersjs/client/pull/228) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) - -## [v3.1.2](https://github.com/feathersjs/client/tree/v3.1.2) (2018-01-02) - -[Full Changelog](https://github.com/feathersjs/client/compare/v3.1.1...v3.1.2) - -**Closed issues:** - -- Socket.io on iOS and Firefox don't work [\#225](https://github.com/feathersjs/client/issues/225) - -**Merged pull requests:** - -- Update @feathersjs/feathers to the latest version 🚀 [\#227](https://github.com/feathersjs/client/pull/227) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) -- Update semistandard to the latest version 🚀 [\#226](https://github.com/feathersjs/client/pull/226) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) - -## [v3.1.1](https://github.com/feathersjs/client/tree/v3.1.1) (2017-12-05) - -[Full Changelog](https://github.com/feathersjs/client/compare/v3.1.0...v3.1.1) - -**Merged pull requests:** - -- Update @feathersjs/feathers to the latest version 🚀 [\#224](https://github.com/feathersjs/client/pull/224) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) -- Update feathers-memory to the latest version 🚀 [\#223](https://github.com/feathersjs/client/pull/223) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) -- Update @feathersjs/errors to the latest version 🚀 [\#222](https://github.com/feathersjs/client/pull/222) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) -- Update @feathersjs/errors to the latest version 🚀 [\#221](https://github.com/feathersjs/client/pull/221) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) - -## [v3.1.0](https://github.com/feathersjs/client/tree/v3.1.0) (2017-11-16) - -[Full Changelog](https://github.com/feathersjs/client/compare/v3.0.0...v3.1.0) - -**Merged pull requests:** - -- Link client packages directly to builds and update all dependencies [\#219](https://github.com/feathersjs/client/pull/219) ([daffl](https://github.com/daffl)) -- Update @feathersjs/feathers to the latest version 🚀 [\#217](https://github.com/feathersjs/client/pull/217) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) -- Update package.json [\#215](https://github.com/feathersjs/client/pull/215) ([frank-dspeed](https://github.com/frank-dspeed)) - -## [v3.0.0](https://github.com/feathersjs/client/tree/v3.0.0) (2017-11-01) - -[Full Changelog](https://github.com/feathersjs/client/compare/v3.0.0-pre.1...v3.0.0) - -**Merged pull requests:** - -- Update dependencies for release [\#214](https://github.com/feathersjs/client/pull/214) ([daffl](https://github.com/daffl)) - -## [v3.0.0-pre.1](https://github.com/feathersjs/client/tree/v3.0.0-pre.1) (2017-10-30) - -[Full Changelog](https://github.com/feathersjs/client/compare/v2.4.0...v3.0.0-pre.1) - -**Closed issues:** - -- help data - angularjs [\#210](https://github.com/feathersjs/client/issues/210) -- npm packages are installed even if they already exist when creating a new sequelize mysql service [\#209](https://github.com/feathersjs/client/issues/209) -- Do you need feathers setup on the server to use feathers on the client? [\#196](https://github.com/feathersjs/client/issues/196) -- Reorganization of client-side repositories [\#137](https://github.com/feathersjs/client/issues/137) - -**Merged pull requests:** - -- Upgrade to Feathers v3 \(Buzzard\) and new builds [\#213](https://github.com/feathersjs/client/pull/213) ([daffl](https://github.com/daffl)) -- Update dependencies to enable Greenkeeper 🌴 [\#212](https://github.com/feathersjs/client/pull/212) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) -- Update feathers-hooks to the latest version 🚀 [\#208](https://github.com/feathersjs/client/pull/208) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) -- Update feathers to the latest version 🚀 [\#207](https://github.com/feathersjs/client/pull/207) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) -- Update mocha to the latest version 🚀 [\#206](https://github.com/feathersjs/client/pull/206) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) -- update script src deps example [\#205](https://github.com/feathersjs/client/pull/205) ([crobinson42](https://github.com/crobinson42)) -- Update feathers to the latest version 🚀 [\#204](https://github.com/feathersjs/client/pull/204) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) -- Update feathers-hooks to the latest version 🚀 [\#203](https://github.com/feathersjs/client/pull/203) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) -- Update feathers-hooks to the latest version 🚀 [\#202](https://github.com/feathersjs/client/pull/202) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) -- Update feathers to the latest version 🚀 [\#201](https://github.com/feathersjs/client/pull/201) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) -- Update feathers-hooks to the latest version 🚀 [\#200](https://github.com/feathersjs/client/pull/200) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) -- Update TypeScript definition for service.patch [\#199](https://github.com/feathersjs/client/pull/199) ([kfatehi](https://github.com/kfatehi)) -- Update feathers-errors to the latest version 🚀 [\#197](https://github.com/feathersjs/client/pull/197) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) - -## [v2.4.0](https://github.com/feathersjs/client/tree/v2.4.0) (2017-09-02) - -[Full Changelog](https://github.com/feathersjs/client/compare/v2.3.0...v2.4.0) - -**Closed issues:** - -- Feathers Authentication returning NotFound: Page not found [\#188](https://github.com/feathersjs/client/issues/188) -- Typescript import build error [\#179](https://github.com/feathersjs/client/issues/179) - -**Merged pull requests:** - -- Update feathers to the latest version 🚀 [\#195](https://github.com/feathersjs/client/pull/195) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) -- Add default export to TypeScript definition [\#194](https://github.com/feathersjs/client/pull/194) ([jonlambert](https://github.com/jonlambert)) -- Update ws to the latest version 🚀 [\#193](https://github.com/feathersjs/client/pull/193) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) -- Update feathers-errors to the latest version 🚀 [\#192](https://github.com/feathersjs/client/pull/192) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) -- Update feathers-errors to the latest version 🚀 [\#191](https://github.com/feathersjs/client/pull/191) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) -- fix\(package\): update feathers to version 2.1.7 [\#190](https://github.com/feathersjs/client/pull/190) ([daffl](https://github.com/daffl)) -- Update feathers-hooks to the latest version 🚀 [\#187](https://github.com/feathersjs/client/pull/187) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) -- Update feathers-errors to the latest version 🚀 [\#186](https://github.com/feathersjs/client/pull/186) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) - -## [v2.3.0](https://github.com/feathersjs/client/tree/v2.3.0) (2017-07-04) - -[Full Changelog](https://github.com/feathersjs/client/compare/v2.2.0...v2.3.0) - -**Closed issues:** - -- An in-range update of socket.io-client is breaking the build 🚨 [\#181](https://github.com/feathersjs/client/issues/181) -- Drop socket.io [\#177](https://github.com/feathersjs/client/issues/177) -- Providing client connection metadata for service event filtering purpose [\#172](https://github.com/feathersjs/client/issues/172) -- Support offline mode [\#29](https://github.com/feathersjs/client/issues/29) - -**Merged pull requests:** - -- Update feathers-rest to the latest version 🚀 [\#185](https://github.com/feathersjs/client/pull/185) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) -- Update feathers-rest to the latest version 🚀 [\#184](https://github.com/feathersjs/client/pull/184) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) -- Remove IE edge again since it does not seem to be running on Saucelabs [\#183](https://github.com/feathersjs/client/pull/183) ([daffl](https://github.com/daffl)) -- Update feathers to the latest version 🚀 [\#182](https://github.com/feathersjs/client/pull/182) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) -- Update feathers-rest to the latest version 🚀 [\#180](https://github.com/feathersjs/client/pull/180) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) -- Update feathers-errors to the latest version 🚀 [\#178](https://github.com/feathersjs/client/pull/178) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) -- Update feathers to the latest version 🚀 [\#176](https://github.com/feathersjs/client/pull/176) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) -- Update feathers-primus to the latest version 🚀 [\#175](https://github.com/feathersjs/client/pull/175) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) -- Update feathers-socketio to the latest version 🚀 [\#173](https://github.com/feathersjs/client/pull/173) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) -- Update feathers to the latest version 🚀 [\#171](https://github.com/feathersjs/client/pull/171) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) -- Update socket.io-client to the latest version 🚀 [\#170](https://github.com/feathersjs/client/pull/170) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) -- Update feathers-errors to the latest version 🚀 [\#169](https://github.com/feathersjs/client/pull/169) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) -- Update feathers-errors to the latest version 🚀 [\#168](https://github.com/feathersjs/client/pull/168) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) -- Update feathers-hooks to the latest version 🚀 [\#167](https://github.com/feathersjs/client/pull/167) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) -- Add IE Edge instead of IE 9 [\#166](https://github.com/feathersjs/client/pull/166) ([daffl](https://github.com/daffl)) - -## [v2.2.0](https://github.com/feathersjs/client/tree/v2.2.0) (2017-04-25) - -[Full Changelog](https://github.com/feathersjs/client/compare/v2.1.0...v2.2.0) - -**Merged pull requests:** - -- Update feathers-errors to the latest version 🚀 [\#165](https://github.com/feathersjs/client/pull/165) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) -- Add feathers-errors test [\#164](https://github.com/feathersjs/client/pull/164) ([christopherjbaker](https://github.com/christopherjbaker)) -- Update semistandard to the latest version 🚀 [\#163](https://github.com/feathersjs/client/pull/163) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) - -## [v2.1.0](https://github.com/feathersjs/client/tree/v2.1.0) (2017-04-18) - -[Full Changelog](https://github.com/feathersjs/client/compare/v2.0.0...v2.1.0) - -**Closed issues:** - -- implementation of feathers client in angular-2 [\#135](https://github.com/feathersjs/client/issues/135) - -**Merged pull requests:** - -- Update feathers-hooks to the latest version 🚀 [\#162](https://github.com/feathersjs/client/pull/162) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) -- Update dependencies to enable Greenkeeper 🌴 [\#161](https://github.com/feathersjs/client/pull/161) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper)) -- Added generics to typescript definition. [\#158](https://github.com/feathersjs/client/pull/158) ([noah79](https://github.com/noah79)) - -## [v2.0.0](https://github.com/feathersjs/client/tree/v2.0.0) (2017-04-11) - -[Full Changelog](https://github.com/feathersjs/client/compare/v2.0.0-pre.2...v2.0.0) - -**Closed issues:** - -- Bundled feathers.js - Socket Authentication with Local Strategy Always Times Out [\#155](https://github.com/feathersjs/client/issues/155) - -**Merged pull requests:** - -- Update feathers-rest to version 1.7.2 🚀 [\#160](https://github.com/feathersjs/client/pull/160) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) - -## [v2.0.0-pre.2](https://github.com/feathersjs/client/tree/v2.0.0-pre.2) (2017-03-08) - -[Full Changelog](https://github.com/feathersjs/client/compare/v2.0.0-pre.1...v2.0.0-pre.2) - -**Closed issues:** - -- Authentication should be removed [\#136](https://github.com/feathersjs/client/issues/136) - -**Merged pull requests:** - -- Lock package.json versions [\#153](https://github.com/feathersjs/client/pull/153) ([daffl](https://github.com/daffl)) -- Add feathers-errors to the client export [\#152](https://github.com/feathersjs/client/pull/152) ([daffl](https://github.com/daffl)) -- Update feathers to version 2.1.1 🚀 [\#151](https://github.com/feathersjs/client/pull/151) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Update feathers-socketio to version 1.5.2 🚀 [\#150](https://github.com/feathersjs/client/pull/150) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Update feathers-hooks to version 1.8.1 🚀 [\#149](https://github.com/feathersjs/client/pull/149) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Update feathers-rest to version 1.7.1 🚀 [\#148](https://github.com/feathersjs/client/pull/148) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Update feathers-socketio to version 1.5.1 🚀 [\#147](https://github.com/feathersjs/client/pull/147) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Update feathers-socketio to version 1.5.0 🚀 [\#146](https://github.com/feathersjs/client/pull/146) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Update feathers-rest to version 1.7.0 🚀 [\#145](https://github.com/feathersjs/client/pull/145) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Update feathers-primus to version 2.1.0 🚀 [\#144](https://github.com/feathersjs/client/pull/144) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Update feathers-hooks to version 1.8.0 🚀 [\#143](https://github.com/feathersjs/client/pull/143) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Update feathers to version 2.1.0 🚀 [\#142](https://github.com/feathersjs/client/pull/142) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Update feathers-socketio to version 1.4.3 🚀 [\#141](https://github.com/feathersjs/client/pull/141) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Update browserify to version 14.1.0 🚀 [\#140](https://github.com/feathersjs/client/pull/140) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Update ws to version 2.0.0 🚀 [\#139](https://github.com/feathersjs/client/pull/139) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) - -## [v2.0.0-pre.1](https://github.com/feathersjs/client/tree/v2.0.0-pre.1) (2017-01-11) - -[Full Changelog](https://github.com/feathersjs/client/compare/v1.9.0...v2.0.0-pre.1) - -**Closed issues:** - -- Socket.io timeout does nothing when there is JWT token available [\#129](https://github.com/feathersjs/client/issues/129) - -**Merged pull requests:** - -- Feathers Auth Update [\#131](https://github.com/feathersjs/client/pull/131) ([flyboarder](https://github.com/flyboarder)) - -## [v1.9.0](https://github.com/feathersjs/client/tree/v1.9.0) (2016-12-31) - -[Full Changelog](https://github.com/feathersjs/client/compare/v1.8.0...v1.9.0) - -**Closed issues:** - -- Typings don't include configure method [\#130](https://github.com/feathersjs/client/issues/130) - -**Merged pull requests:** - -- Add .configure method to TypeScript definitions [\#134](https://github.com/feathersjs/client/pull/134) ([daffl](https://github.com/daffl)) -- Update feathers-rest to version 1.6.0 🚀 [\#133](https://github.com/feathersjs/client/pull/133) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Update feathers-rest to version 1.5.3 🚀 [\#132](https://github.com/feathersjs/client/pull/132) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Update feathers-hooks to version 1.7.1 🚀 [\#128](https://github.com/feathersjs/client/pull/128) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- socket.io-client@1.7.2 breaks build 🚨 [\#126](https://github.com/feathersjs/client/pull/126) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Update feathers to version 2.0.3 🚀 [\#125](https://github.com/feathersjs/client/pull/125) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Typings changes. [\#124](https://github.com/feathersjs/client/pull/124) ([ninachaubal](https://github.com/ninachaubal)) -- Update feathers-primus to version 2.0.0 🚀 [\#123](https://github.com/feathersjs/client/pull/123) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- feathers-commons@0.8.7 breaks build 🚨 [\#122](https://github.com/feathersjs/client/pull/122) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- superagent@3.1.0 breaks build 🚨 [\#121](https://github.com/feathersjs/client/pull/121) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) - -## [v1.8.0](https://github.com/feathersjs/client/tree/v1.8.0) (2016-11-26) - -[Full Changelog](https://github.com/feathersjs/client/compare/v1.7.2...v1.8.0) - -**Closed issues:** - -- How to get `hooks` `socketio` etc from `feathers` object [\#118](https://github.com/feathersjs/client/issues/118) -- send back to server additional fields in 'params' besides 'query' [\#115](https://github.com/feathersjs/client/issues/115) - -**Merged pull requests:** - -- Update feathers-hooks to version 1.7.0 🚀 [\#120](https://github.com/feathersjs/client/pull/120) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Remove reference to typings/index.d.ts [\#119](https://github.com/feathersjs/client/pull/119) ([ninachaubal](https://github.com/ninachaubal)) -- Update superagent to version 3.0.0 🚀 [\#116](https://github.com/feathersjs/client/pull/116) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Add TypeScript type definitions. [\#114](https://github.com/feathersjs/client/pull/114) ([ninachaubal](https://github.com/ninachaubal)) -- Update feathers-memory to version 1.0.0 🚀 [\#113](https://github.com/feathersjs/client/pull/113) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Update feathers-authentication to version 0.7.12 🚀 [\#112](https://github.com/feathersjs/client/pull/112) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Update feathers-commons to version 0.8.0 🚀 [\#111](https://github.com/feathersjs/client/pull/111) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) - -## [v1.7.2](https://github.com/feathersjs/client/tree/v1.7.2) (2016-11-08) - -[Full Changelog](https://github.com/feathersjs/client/compare/v1.7.1...v1.7.2) - -**Merged pull requests:** - -- Update feathers-rest to version 1.5.2 🚀 [\#110](https://github.com/feathersjs/client/pull/110) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Update feathers-socketio to version 1.4.2 🚀 [\#109](https://github.com/feathersjs/client/pull/109) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) - -## [v1.7.1](https://github.com/feathersjs/client/tree/v1.7.1) (2016-11-02) - -[Full Changelog](https://github.com/feathersjs/client/compare/v1.7.0...v1.7.1) - -**Closed issues:** - -- Bower: Version mismatch [\#104](https://github.com/feathersjs/client/issues/104) - -**Merged pull requests:** - -- Update feathers-hooks to version 1.6.1 🚀 [\#108](https://github.com/feathersjs/client/pull/108) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Make sure Bower and NPM version are in sync [\#107](https://github.com/feathersjs/client/pull/107) ([daffl](https://github.com/daffl)) - -## [v1.7.0](https://github.com/feathersjs/client/tree/v1.7.0) (2016-11-02) - -[Full Changelog](https://github.com/feathersjs/client/compare/v1.6.2...v1.7.0) - -**Closed issues:** - -- How to access feathers-client [\#102](https://github.com/feathersjs/client/issues/102) -- Set up Saucelabs [\#97](https://github.com/feathersjs/client/issues/97) - -**Merged pull requests:** - -- 👻😱 Node.js 0.10 is unmaintained 😱👻 [\#106](https://github.com/feathersjs/client/pull/106) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Update feathers-hooks to version 1.6.0 🚀 [\#105](https://github.com/feathersjs/client/pull/105) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Change variable naming from "app" to "feathersClient" [\#103](https://github.com/feathersjs/client/pull/103) ([nicoknoll](https://github.com/nicoknoll)) -- jshint —\> semistandard [\#101](https://github.com/feathersjs/client/pull/101) ([corymsmith](https://github.com/corymsmith)) -- Cross browser testing in Saucelabs [\#100](https://github.com/feathersjs/client/pull/100) ([daffl](https://github.com/daffl)) - -## [v1.6.2](https://github.com/feathersjs/client/tree/v1.6.2) (2016-10-22) - -[Full Changelog](https://github.com/feathersjs/client/compare/v1.6.1...v1.6.2) - -**Closed issues:** - -- Browser Support [\#96](https://github.com/feathersjs/client/issues/96) -- How to destroy feathers and socketio client? [\#95](https://github.com/feathersjs/client/issues/95) -- Use tests from feathers-commons [\#26](https://github.com/feathersjs/client/issues/26) - -**Merged pull requests:** - -- Update feathers-rest to version 1.5.1 🚀 [\#99](https://github.com/feathersjs/client/pull/99) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Use tests from feathers-commons [\#98](https://github.com/feathersjs/client/pull/98) ([daffl](https://github.com/daffl)) -- Update feathers-authentication to version 0.7.11 🚀 [\#92](https://github.com/feathersjs/client/pull/92) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Update feathers-hooks to version 1.5.8 🚀 [\#91](https://github.com/feathersjs/client/pull/91) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) - -## [v1.6.1](https://github.com/feathersjs/client/tree/v1.6.1) (2016-09-15) - -[Full Changelog](https://github.com/feathersjs/client/compare/v1.6.0...v1.6.1) - -**Closed issues:** - -- documentation on how to build client [\#87](https://github.com/feathersjs/client/issues/87) - -**Merged pull requests:** - -- Update feathers to version 2.0.2 🚀 [\#90](https://github.com/feathersjs/client/pull/90) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) - -## [v1.6.0](https://github.com/feathersjs/client/tree/v1.6.0) (2016-09-09) - -[Full Changelog](https://github.com/feathersjs/client/compare/v1.5.3...v1.6.0) - -**Closed issues:** - -- How to declare the app in a static way? [\#86](https://github.com/feathersjs/client/issues/86) -- feathers client and requireJS [\#85](https://github.com/feathersjs/client/issues/85) -- SocketIO timeout based on service [\#84](https://github.com/feathersjs/client/issues/84) - -**Merged pull requests:** - -- Update feathers-rest to version 1.5.0 🚀 [\#89](https://github.com/feathersjs/client/pull/89) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Update feathers-memory to version 0.8.0 🚀 [\#88](https://github.com/feathersjs/client/pull/88) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) - -## [v1.5.3](https://github.com/feathersjs/client/tree/v1.5.3) (2016-08-31) - -[Full Changelog](https://github.com/feathersjs/client/compare/v1.5.2...v1.5.3) - -**Closed issues:** - -- Use of feathers-client with es6 \(JSPM\) [\#78](https://github.com/feathersjs/client/issues/78) - -**Merged pull requests:** - -- Update feathers-authentication to version 0.7.10 🚀 [\#82](https://github.com/feathersjs/client/pull/82) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Update feathers-hooks to version 1.5.7 🚀 [\#77](https://github.com/feathersjs/client/pull/77) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Update feathers-rest to version 1.4.4 🚀 [\#76](https://github.com/feathersjs/client/pull/76) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Update feathers-hooks to version 1.5.6 🚀 [\#75](https://github.com/feathersjs/client/pull/75) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) - -## [v1.5.2](https://github.com/feathersjs/client/tree/v1.5.2) (2016-08-12) - -[Full Changelog](https://github.com/feathersjs/client/compare/v1.5.1...v1.5.2) - -**Closed issues:** - -- \[Question\] Large client-side bundle filesize when requiring feathers client [\#71](https://github.com/feathersjs/client/issues/71) - -**Merged pull requests:** - -- Update feathers-hooks to version 1.5.5 🚀 [\#73](https://github.com/feathersjs/client/pull/73) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Update mocha to version 3.0.0 🚀 [\#72](https://github.com/feathersjs/client/pull/72) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) - -## [v1.5.1](https://github.com/feathersjs/client/tree/v1.5.1) (2016-07-14) - -[Full Changelog](https://github.com/feathersjs/client/compare/v1.5.0...v1.5.1) - -**Merged pull requests:** - -- Update feathers-rest to version 1.4.3 🚀 [\#70](https://github.com/feathersjs/client/pull/70) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) - -## [v1.5.0](https://github.com/feathersjs/client/tree/v1.5.0) (2016-07-05) - -[Full Changelog](https://github.com/feathersjs/client/compare/v1.4.1...v1.5.0) - -**Closed issues:** - -- Refresh browser [\#68](https://github.com/feathersjs/client/issues/68) - -## [v1.4.1](https://github.com/feathersjs/client/tree/v1.4.1) (2016-06-27) - -[Full Changelog](https://github.com/feathersjs/client/compare/v1.4.0...v1.4.1) - -## [v1.4.0](https://github.com/feathersjs/client/tree/v1.4.0) (2016-06-24) - -[Full Changelog](https://github.com/feathersjs/client/compare/v1.3.2...v1.4.0) - -**Closed issues:** - -- feathers.min.js? [\#64](https://github.com/feathersjs/client/issues/64) -- Facebook login [\#62](https://github.com/feathersjs/client/issues/62) - -**Merged pull requests:** - -- Add dist/feathers.min.js [\#65](https://github.com/feathersjs/client/pull/65) ([daffl](https://github.com/daffl)) -- Update feathers-authentication to version 0.7.9 🚀 [\#63](https://github.com/feathersjs/client/pull/63) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) - -## [v1.3.2](https://github.com/feathersjs/client/tree/v1.3.2) (2016-06-09) - -[Full Changelog](https://github.com/feathersjs/client/compare/v1.3.1...v1.3.2) - -**Merged pull requests:** - -- Update feathers-authentication to version 0.7.8 🚀 [\#61](https://github.com/feathersjs/client/pull/61) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) - -## [v1.3.1](https://github.com/feathersjs/client/tree/v1.3.1) (2016-06-04) - -[Full Changelog](https://github.com/feathersjs/client/compare/v1.3.0...v1.3.1) - -**Merged pull requests:** - -- Update feathers-rest to version 1.4.2 🚀 [\#60](https://github.com/feathersjs/client/pull/60) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) - -## [v1.3.0](https://github.com/feathersjs/client/tree/v1.3.0) (2016-05-30) - -[Full Changelog](https://github.com/feathersjs/client/compare/v1.2.1...v1.3.0) - -**Merged pull requests:** - -- Update feathers-rest to version 1.4.1 🚀 [\#59](https://github.com/feathersjs/client/pull/59) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Update feathers-hooks to version 1.5.4 🚀 [\#57](https://github.com/feathersjs/client/pull/57) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Update superagent to version 2.0.0 🚀 [\#56](https://github.com/feathersjs/client/pull/56) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Update feathers-socketio to version 1.4.1 🚀 [\#53](https://github.com/feathersjs/client/pull/53) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Update feathers-primus to version 1.4.1 🚀 [\#52](https://github.com/feathersjs/client/pull/52) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) - -## [v1.2.1](https://github.com/feathersjs/client/tree/v1.2.1) (2016-05-19) - -[Full Changelog](https://github.com/feathersjs/client/compare/v1.2.0...v1.2.1) - -**Closed issues:** - -- Feathers-client not return correct error object. [\#44](https://github.com/feathersjs/client/issues/44) - -**Merged pull requests:** - -- Lock versions for Greenkeeper to make a PR for every release [\#50](https://github.com/feathersjs/client/pull/50) ([daffl](https://github.com/daffl)) -- Update babel-plugin-add-module-exports to version 0.2.0 🚀 [\#46](https://github.com/feathersjs/client/pull/46) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) - -## [v1.2.0](https://github.com/feathersjs/client/tree/v1.2.0) (2016-04-29) - -[Full Changelog](https://github.com/feathersjs/client/compare/v1.1.0...v1.2.0) - -**Closed issues:** - -- Socket.io timeouts? [\#42](https://github.com/feathersjs/client/issues/42) -- Add batch support [\#4](https://github.com/feathersjs/client/issues/4) - -**Merged pull requests:** - -- nsp@2.3.2 breaks build 🚨 [\#41](https://github.com/feathersjs/client/pull/41) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Fixing url for link in readme to feathers-authentication [\#39](https://github.com/feathersjs/client/pull/39) ([xiplias](https://github.com/xiplias)) -- feathers-primus@1.3.3 breaks build 🚨 [\#38](https://github.com/feathersjs/client/pull/38) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- ws@1.1.0 breaks build 🚨 [\#36](https://github.com/feathersjs/client/pull/36) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Update feathers-memory to version 0.7.0 🚀 [\#33](https://github.com/feathersjs/client/pull/33) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) - -## [v1.1.0](https://github.com/feathersjs/client/tree/v1.1.0) (2016-04-03) - -[Full Changelog](https://github.com/feathersjs/client/compare/v1.0.0...v1.1.0) - -**Merged pull requests:** - -- Update all dependencies 🌴 [\#31](https://github.com/feathersjs/client/pull/31) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) - -## [v1.0.0](https://github.com/feathersjs/client/tree/v1.0.0) (2016-03-14) - -[Full Changelog](https://github.com/feathersjs/client/compare/v1.0.0-pre.3...v1.0.0) - -**Merged pull requests:** - -- Use a gcc version that can build bcrypt [\#30](https://github.com/feathersjs/client/pull/30) ([daffl](https://github.com/daffl)) - -## [v1.0.0-pre.3](https://github.com/feathersjs/client/tree/v1.0.0-pre.3) (2016-03-14) - -[Full Changelog](https://github.com/feathersjs/client/compare/v1.0.0-pre.2...v1.0.0-pre.3) - -## [v1.0.0-pre.2](https://github.com/feathersjs/client/tree/v1.0.0-pre.2) (2016-03-04) - -[Full Changelog](https://github.com/feathersjs/client/compare/v0.5.3...v1.0.0-pre.2) - -**Closed issues:** - -- Can't get $regex to work in find function with feathers-nedb in the background [\#28](https://github.com/feathersjs/client/issues/28) -- feathers.fetch is undefined [\#27](https://github.com/feathersjs/client/issues/27) -- Add documentation for using in React Native [\#10](https://github.com/feathersjs/client/issues/10) - -## [v0.5.3](https://github.com/feathersjs/client/tree/v0.5.3) (2016-02-12) - -[Full Changelog](https://github.com/feathersjs/client/compare/v1.0.0-pre.1...v0.5.3) - -## [v1.0.0-pre.1](https://github.com/feathersjs/client/tree/v1.0.0-pre.1) (2016-02-11) - -[Full Changelog](https://github.com/feathersjs/client/compare/v0.5.2...v1.0.0-pre.1) - -## [v0.5.2](https://github.com/feathersjs/client/tree/v0.5.2) (2016-02-09) - -[Full Changelog](https://github.com/feathersjs/client/compare/v0.5.1...v0.5.2) - -**Merged pull requests:** - -- Universal feathers [\#25](https://github.com/feathersjs/client/pull/25) ([daffl](https://github.com/daffl)) -- Adding nsp check [\#24](https://github.com/feathersjs/client/pull/24) ([marshallswain](https://github.com/marshallswain)) - -## [v0.5.1](https://github.com/feathersjs/client/tree/v0.5.1) (2016-01-15) - -[Full Changelog](https://github.com/feathersjs/client/compare/v0.5.0...v0.5.1) - -**Closed issues:** - -- REST base.js missing ${options.base} leads to broken relative url [\#21](https://github.com/feathersjs/client/issues/21) -- Add hook support [\#20](https://github.com/feathersjs/client/issues/20) -- $sort does not work for find\(\) [\#19](https://github.com/feathersjs/client/issues/19) - -**Merged pull requests:** - -- fix issue \#21 [\#22](https://github.com/feathersjs/client/pull/22) ([wuyuanyi135](https://github.com/wuyuanyi135)) - -## [v0.5.0](https://github.com/feathersjs/client/tree/v0.5.0) (2016-01-05) - -[Full Changelog](https://github.com/feathersjs/client/compare/v0.4.0...v0.5.0) - -**Closed issues:** - -- how to use in typescript [\#17](https://github.com/feathersjs/client/issues/17) - -**Merged pull requests:** - -- Added fetch support [\#18](https://github.com/feathersjs/client/pull/18) ([corymsmith](https://github.com/corymsmith)) -- Adding events and querystring dependencies. [\#16](https://github.com/feathersjs/client/pull/16) ([marshallswain](https://github.com/marshallswain)) - -## [v0.4.0](https://github.com/feathersjs/client/tree/v0.4.0) (2015-12-11) - -[Full Changelog](https://github.com/feathersjs/client/compare/v0.3.3...v0.4.0) - -**Fixed bugs:** - -- Importing in ES6 is broken [\#14](https://github.com/feathersjs/client/issues/14) - -**Closed issues:** - -- .babelrc messes with react-native [\#15](https://github.com/feathersjs/client/issues/15) - -## [v0.3.3](https://github.com/feathersjs/client/tree/v0.3.3) (2015-11-27) - -[Full Changelog](https://github.com/feathersjs/client/compare/v0.3.2...v0.3.3) - -**Closed issues:** - -- npm package is broken. [\#12](https://github.com/feathersjs/client/issues/12) - -**Merged pull requests:** - -- Fix es6 build and add Steal compatibility. [\#13](https://github.com/feathersjs/client/pull/13) ([marshallswain](https://github.com/marshallswain)) - -## [v0.3.2](https://github.com/feathersjs/client/tree/v0.3.2) (2015-11-26) - -[Full Changelog](https://github.com/feathersjs/client/compare/v0.3.1...v0.3.2) - -**Closed issues:** - -- Update lodash [\#11](https://github.com/feathersjs/client/issues/11) - -## [v0.3.1](https://github.com/feathersjs/client/tree/v0.3.1) (2015-11-26) - -[Full Changelog](https://github.com/feathersjs/client/compare/v0.3.0...v0.3.1) - -**Closed issues:** - -- Working with can-connect [\#8](https://github.com/feathersjs/client/issues/8) - -## [v0.3.0](https://github.com/feathersjs/client/tree/v0.3.0) (2015-11-15) - -[Full Changelog](https://github.com/feathersjs/client/compare/v0.2.1...v0.3.0) - -**Closed issues:** - -- Use Promises [\#7](https://github.com/feathersjs/client/issues/7) - -**Merged pull requests:** - -- Migration to ES6 and using Promises [\#9](https://github.com/feathersjs/client/pull/9) ([daffl](https://github.com/daffl)) - -## [v0.2.1](https://github.com/feathersjs/client/tree/v0.2.1) (2015-10-06) - -[Full Changelog](https://github.com/feathersjs/client/compare/v0.2.0...v0.2.1) - -**Merged pull requests:** - -- Make client depend on feathers-commons, remove arguments.js [\#6](https://github.com/feathersjs/client/pull/6) ([daffl](https://github.com/daffl)) - -## [v0.2.0](https://github.com/feathersjs/client/tree/v0.2.0) (2015-07-18) - -[Full Changelog](https://github.com/feathersjs/client/compare/v0.1.3...v0.2.0) - -## [v0.1.3](https://github.com/feathersjs/client/tree/v0.1.3) (2015-07-06) - -[Full Changelog](https://github.com/feathersjs/client/compare/v0.1.2...v0.1.3) - -**Merged pull requests:** - -- Fixing requires and missing deps. [\#5](https://github.com/feathersjs/client/pull/5) ([marshallswain](https://github.com/marshallswain)) - -## [v0.1.2](https://github.com/feathersjs/client/tree/v0.1.2) (2015-06-22) - -[Full Changelog](https://github.com/feathersjs/client/compare/v0.1.1...v0.1.2) - -**Closed issues:** - -- Publish to NPM and Bower [\#1](https://github.com/feathersjs/client/issues/1) - -## [v0.1.1](https://github.com/feathersjs/client/tree/v0.1.1) (2015-06-21) - -[Full Changelog](https://github.com/feathersjs/client/compare/v0.0.1...v0.1.1) - -## [v0.0.1](https://github.com/feathersjs/client/tree/v0.0.1) (2015-06-21) - -[Full Changelog](https://github.com/feathersjs/client/compare/v0.1.0...v0.0.1) - -## [v0.1.0](https://github.com/feathersjs/client/tree/v0.1.0) (2015-06-06) - -\* _This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)_ diff --git a/packages/client/LICENSE b/packages/client/LICENSE deleted file mode 100644 index 40b7881afa..0000000000 --- a/packages/client/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2015 Feathers - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -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/client/README.md b/packages/client/README.md deleted file mode 100644 index 934b1157f1..0000000000 --- a/packages/client/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# @feathersjs/client - -[![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/client.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/client) -[![Discord](https://badgen.net/badge/icon/discord?icon=discord&label)](https://discord.gg/qa8kez8QBx) - -> A client build for FeathersJS - -## Installation - -``` -npm install @feathersjs/client --save -``` - -## Documentation - -Refer to the [Feathers client API documentation](https://docs.feathersjs.com/api/client.html) 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/client/core.js b/packages/client/core.js deleted file mode 100644 index b55021eddc..0000000000 --- a/packages/client/core.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('./dist/core'); diff --git a/packages/client/package.json b/packages/client/package.json deleted file mode 100644 index 9624434f4e..0000000000 --- a/packages/client/package.json +++ /dev/null @@ -1,78 +0,0 @@ -{ - "name": "@feathersjs/client", - "description": "A module that consolidates Feathers client modules for REST (jQuery, Request, Superagent) and Websocket (Socket.io, Primus) connections", - "version": "5.0.34", - "repository": { - "type": "git", - "url": "https://github.com/feathersjs/feathers.git", - "directory": "packages/client" - }, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/daffl" - }, - "bugs": { - "url": "https://github.com/feathersjs/feathers/issues" - }, - "homepage": "https://github.com/feathersjs/client", - "keywords": [ - "feathers", - "feathers-plugin" - ], - "author": "Feathers contributors", - "engines": { - "node": ">= 12" - }, - "main": "dist/feathers", - "types": "dist/feathers", - "files": [ - "CHANGELOG.md", - "LICENSE", - "README.md", - "src/**", - "dist/**", - "*.d.ts", - "*.js" - ], - "scripts": { - "compile": "tsc", - "version": "npm run build", - "clean": "shx rm -rf dist/ && shx mkdir -p dist", - "build": "npm run clean && npm run compile && npm run webpack", - "mocha": "mocha --config ../../.mocharc.json --recursive test/**/*.test.ts", - "test": "npm run build && npm run mocha", - "webpack": "webpack --config webpack/feathers.js && webpack --config webpack/feathers.min.js && webpack --config webpack/core.js && webpack --config webpack/core.min.js" - }, - "browserslist": [ - "last 2 versions", - "IE 11" - ], - "dependencies": { - "@feathersjs/authentication-client": "^5.0.34", - "@feathersjs/errors": "^5.0.34", - "@feathersjs/feathers": "^5.0.34", - "@feathersjs/rest-client": "^5.0.34", - "@feathersjs/socketio-client": "^5.0.34" - }, - "devDependencies": { - "@babel/core": "^7.28.0", - "@babel/preset-env": "^7.28.0", - "@feathersjs/express": "^5.0.34", - "@feathersjs/memory": "^5.0.34", - "@feathersjs/socketio": "^5.0.34", - "@feathersjs/tests": "^5.0.34", - "babel-loader": "^10.0.0", - "mocha": "^11.7.1", - "node-fetch": "^2.6.1", - "shx": "^0.4.0", - "socket.io-client": "^4.8.1", - "superagent": "^10.2.3", - "ts-loader": "^9.5.2", - "typescript": "^5.9.2", - "webpack": "^5.101.0", - "webpack-cli": "^6.0.1", - "webpack-merge": "^6.0.1" - }, - "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" -} diff --git a/packages/client/src/core.ts b/packages/client/src/core.ts deleted file mode 100644 index 1138c62281..0000000000 --- a/packages/client/src/core.ts +++ /dev/null @@ -1 +0,0 @@ -export * from '@feathersjs/feathers' diff --git a/packages/client/src/feathers.ts b/packages/client/src/feathers.ts deleted file mode 100644 index e3522cb374..0000000000 --- a/packages/client/src/feathers.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { feathers } from '@feathersjs/feathers' -import authentication from '@feathersjs/authentication-client' -import rest from '@feathersjs/rest-client' -import socketio from '@feathersjs/socketio-client' - -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 deleted file mode 100644 index 22f626a4a6..0000000000 --- a/packages/client/test/fetch.test.ts +++ /dev/null @@ -1,24 +0,0 @@ -/* 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' - -describe('fetch REST connector', function () { - let server: Server - const rest = feathers.rest('http://localhost:8889') - const client = feathers.default().configure(rest.fetch(fetch)) - - before(async () => { - server = await app().listen(8889) - }) - - after(function (done) { - server.close(done) - }) - - clientTests(client, 'todos') -}) diff --git a/packages/client/test/fixture.ts b/packages/client/test/fixture.ts deleted file mode 100644 index de42f60d65..0000000000 --- a/packages/client/test/fixture.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { feathers, Application, HookContext, Id, Params } from '@feathersjs/feathers' -import * as express from '@feathersjs/express' -import { MemoryService } from '@feathersjs/memory' - -// eslint-disable-next-line no-extend-native -Object.defineProperty(Error.prototype, 'toJSON', { - value() { - const alt: any = {} - - Object.getOwnPropertyNames(this).forEach((key: string) => { - alt[key] = this[key] - }) - - return alt - }, - configurable: true -}) - -// Create an in-memory CRUD service for our Todos -class TodoService extends MemoryService { - async get(id: Id, params: Params) { - if (params.query.error) { - throw new Error('Something went wrong') - } - - return super.get(id).then((data) => Object.assign({ query: params.query }, data)) - } -} - -export default (configurer?: (app: Application) => void) => { - const app = express - .default(feathers()) - // Parse HTTP bodies - .use(express.json()) - .use(express.urlencoded({ extended: true })) - // Host the current directory (for index.html) - .use(express.static(process.cwd())) - .configure(express.rest()) - - if (typeof configurer === 'function') { - configurer.call(app, app) - } - - app - // Host our Todos service on the /todos path - .use( - '/todos', - new TodoService({ - multi: true - }) - ) - .use(express.errorHandler()) - - const testTodo = { - text: 'some todo', - complete: false - } - const service: any = app.service('todos') - - service.create(testTodo) - service.hooks({ - after: { - remove(hook: HookContext) { - if (hook.id === null) { - service._uId = 0 - return service.create(testTodo).then(() => hook) - } - } - } - }) - - app.on('connection', (connection) => (app as any).channel('general').join(connection)) - - if (service.publish) { - service.publish(() => app.channel('general')) - } - - return app -} diff --git a/packages/client/test/socketio.test.ts b/packages/client/test/socketio.test.ts deleted file mode 100644 index 74a86cd73e..0000000000 --- a/packages/client/test/socketio.test.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { io } from 'socket.io-client' -import socketio from '@feathersjs/socketio' -import { Server } from 'http' -import { clientTests } from '@feathersjs/tests' - -import * as feathers from '../dist/feathers' -import app from './fixture' - -describe('Socket.io connector', function () { - let server: Server - const socket = io('http://localhost:9988') - const client = feathers.default().configure(feathers.socketio(socket)) - - before(async () => { - server = await app((app) => app.configure(socketio())).listen(9988) - }) - - after(function (done) { - socket.once('disconnect', () => { - server.close() - done() - }) - socket.disconnect() - }) - - clientTests(client, 'todos') -}) diff --git a/packages/client/test/superagent.test.ts b/packages/client/test/superagent.test.ts deleted file mode 100644 index ea158b9747..0000000000 --- a/packages/client/test/superagent.test.ts +++ /dev/null @@ -1,22 +0,0 @@ -import superagent from 'superagent' -import { clientTests } from '@feathersjs/tests' -import { Server } from 'http' - -import * as feathers from '../dist/feathers' -import app from './fixture' - -describe('Superagent REST connector', function () { - let server: Server - const rest = feathers.rest('http://localhost:8889') - const client = feathers.default().configure(rest.superagent(superagent)) - - before(async () => { - server = await app().listen(8889) - }) - - after(function (done) { - server.close(done) - }) - - clientTests(client, 'todos') -}) diff --git a/packages/client/tsconfig.json b/packages/client/tsconfig.json deleted file mode 100644 index ea5cc61312..0000000000 --- a/packages/client/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "extends": "../../tsconfig", - "sourceMap": false, - "include": [ - "src/**/*.ts" - ], - "compilerOptions": { - "outDir": "dist/" - } -} diff --git a/packages/client/webpack/core.js b/packages/client/webpack/core.js deleted file mode 100644 index 7b7144dc02..0000000000 --- a/packages/client/webpack/core.js +++ /dev/null @@ -1,3 +0,0 @@ -const createConfig = require('./create-config'); - -module.exports = createConfig('core'); \ No newline at end of file diff --git a/packages/client/webpack/core.min.js b/packages/client/webpack/core.min.js deleted file mode 100644 index 79bd67d793..0000000000 --- a/packages/client/webpack/core.min.js +++ /dev/null @@ -1,3 +0,0 @@ -const createConfig = require('./create-config'); - -module.exports = createConfig('core', true); \ No newline at end of file diff --git a/packages/client/webpack/create-config.js b/packages/client/webpack/create-config.js deleted file mode 100644 index 513d36da26..0000000000 --- a/packages/client/webpack/create-config.js +++ /dev/null @@ -1,54 +0,0 @@ -const path = require('path'); -const webpack = require('webpack'); -const { merge } = require('webpack-merge'); - -module.exports = function createConfig (output, isProduction = false) { - const commons = { - entry: [ - `./src/${output}.ts` - ], - output: { - library: 'feathers', - libraryTarget: 'umd', - globalObject: 'this', - path: path.resolve(__dirname, '..', 'dist'), - filename: `${output}.js` - }, - resolve: { - 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'] - } - }] - } - }; - - const dev = { - mode: 'development', - devtool: 'source-map' - }; - const production = { - mode: 'production', - output: { - filename: `${output}.min.js` - }, - plugins: [ - new webpack.DefinePlugin({ - 'process.env.NODE_ENV': JSON.stringify('production') - }) - ] - }; - - return merge(commons, isProduction ? production : dev); -} diff --git a/packages/client/webpack/feathers.js b/packages/client/webpack/feathers.js deleted file mode 100644 index cf576327ba..0000000000 --- a/packages/client/webpack/feathers.js +++ /dev/null @@ -1,3 +0,0 @@ -const createConfig = require('./create-config'); - -module.exports = createConfig('feathers'); \ No newline at end of file diff --git a/packages/client/webpack/feathers.min.js b/packages/client/webpack/feathers.min.js deleted file mode 100644 index 38e64abe7c..0000000000 --- a/packages/client/webpack/feathers.min.js +++ /dev/null @@ -1,3 +0,0 @@ -const createConfig = require('./create-config'); - -module.exports = createConfig('feathers', true); \ No newline at end of file diff --git a/packages/commons/CHANGELOG.md b/packages/commons/CHANGELOG.md deleted file mode 100644 index de7fb44b8c..0000000000 --- a/packages/commons/CHANGELOG.md +++ /dev/null @@ -1,892 +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.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/commons - -## [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/commons - -## [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/commons - -## [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/commons - -## [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/commons - -## [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/commons - -## [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/commons - -## [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/commons - -## [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/commons - -## [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/commons - -## [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/commons - -## [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/commons - -## [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/commons - -## [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/commons - -## [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/commons - -## [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/commons - -## [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/commons - -## [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/commons - -## [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/commons - -## [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/commons - -## [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/commons - -## [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/commons - -## [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/commons - -## [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/commons - -## [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/commons - -## [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) - -### Bug Fixes - -- **core:** Use Symbol.for to instantiate shared symbols ([#3087](https://github.com/feathersjs/feathers/issues/3087)) ([7f3fc21](https://github.com/feathersjs/feathers/commit/7f3fc2167576f228f8183568eb52b077160e8d65)) - -# [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/commons - -# [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/commons - -# [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/commons - -# [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/commons - -# [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/commons - -# [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/commons - -# [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/commons - -# [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 @feathersjs/commons - -# [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/commons - -# [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/commons - -# [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/commons - -# [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/commons - -# [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/commons - -# [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/commons - -# [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/commons - -# [5.0.0-pre.20](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.19...v5.0.0-pre.20) (2022-05-04) - -**Note:** Version bump only for package @feathersjs/commons - -# [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/commons - -# [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/commons - -# [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/commons - -# [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/commons - -# [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/commons - -# [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/commons - -# [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/commons - -# [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/commons - -# [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/commons - -# [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/commons - -# [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/commons - -# [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/commons - -# [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/commons - -# [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/commons - -# [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/commons - -# [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/commons - -# [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)) - -### Features - -- **dependencies:** Remove direct debug dependency ([#2296](https://github.com/feathersjs/feathers/issues/2296)) ([501d416](https://github.com/feathersjs/feathers/commit/501d4164d30c6a126906dc640cdfdc82207ba34a)) - -# [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/commons - -# [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/commons - -# [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) - -### Features - -- **core:** Migrate @feathersjs/feathers to TypeScript ([#1963](https://github.com/feathersjs/feathers/issues/1963)) ([7812529](https://github.com/feathersjs/feathers/commit/7812529ff0f1008e21211f1d01efbc49795dbe55)) -- **core:** use @feathers/hooks and add async type ([#1929](https://github.com/feathersjs/feathers/issues/1929)) ([a5c4756](https://github.com/feathersjs/feathers/commit/a5c47562eae8410c82fe2f6308f26f8e78b6a3e8)) - -# [5.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v4.5.4...v5.0.0-pre.0) (2020-05-19) - -### Features - -- **core:** Migrate @feathersjs/feathers to TypeScript ([#1963](https://github.com/feathersjs/feathers/issues/1963)) ([7812529](https://github.com/feathersjs/feathers/commit/7812529ff0f1008e21211f1d01efbc49795dbe55)) -- **core:** use @feathers/hooks and add async type ([#1929](https://github.com/feathersjs/feathers/issues/1929)) ([a5c4756](https://github.com/feathersjs/feathers/commit/a5c47562eae8410c82fe2f6308f26f8e78b6a3e8)) - -## [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/commons - -## [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/commons - -## [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/commons - -## [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/commons - -## [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/commons - -## [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/commons - -## [4.5.3](https://github.com/feathersjs/feathers/compare/v4.5.2...v4.5.3) (2020-04-17) - -**Note:** Version bump only for package @feathersjs/commons - -## [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/commons - -## [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/commons - -# [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/commons - -## [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/commons - -## [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/commons - -## [4.3.7](https://github.com/feathersjs/feathers/compare/v4.3.6...v4.3.7) (2019-10-14) - -### Bug Fixes - -- make \_\_hooks writable and configurable ([#1520](https://github.com/feathersjs/feathers/issues/1520)) ([1c6c374](https://github.com/feathersjs/feathers/commit/1c6c3742ecf1cb813be56074da89e6736d03ffe8)) - -# [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/commons - -# [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/commons - -# [4.3.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.2...v4.3.0-pre.3) (2019-08-19) - -### Bug Fixes - -- Update all dependencies ([7d53a00](https://github.com/feathersjs/feathers/commit/7d53a00)) - -# [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/commons - -# [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/commons - -# [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/commons - -# [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/commons - -# [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.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 all dependencies to latest ([#1206](https://github.com/feathersjs/feathers/issues/1206)) ([e51e0f6](https://github.com/feathersjs/feathers/commit/e51e0f6)) -- use minimal RegExp matching for better performance ([#977](https://github.com/feathersjs/feathers/issues/977)) ([3ca7e97](https://github.com/feathersjs/feathers/commit/3ca7e97)) - -### Features - -- Add TypeScript definitions ([#1275](https://github.com/feathersjs/feathers/issues/1275)) ([9dd6713](https://github.com/feathersjs/feathers/commit/9dd6713)) -- Common database adapter utilities and test suite ([#1130](https://github.com/feathersjs/feathers/issues/1130)) ([17b3dc8](https://github.com/feathersjs/feathers/commit/17b3dc8)) -- Remove (hook, next) signature and SKIP support ([#1269](https://github.com/feathersjs/feathers/issues/1269)) ([211c0f8](https://github.com/feathersjs/feathers/commit/211c0f8)) - -### BREAKING CHANGES - -- Move database adapter utilities from @feathersjs/commons into its own module - - - -# [4.0.0](https://github.com/feathersjs/feathers/compare/@feathersjs/commons@3.0.1...@feathersjs/commons@4.0.0) (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)) - -### Features - -- Common database adapter utilities and test suite ([#1130](https://github.com/feathersjs/feathers/issues/1130)) ([17b3dc8](https://github.com/feathersjs/feathers/commit/17b3dc8)) - -### BREAKING CHANGES - -- Move database adapter utilities from @feathersjs/commons into its own module - - - -## [3.0.1](https://github.com/feathersjs/feathers/compare/@feathersjs/commons@3.0.0...@feathersjs/commons@3.0.1) (2018-09-17) - -### Bug Fixes - -- use minimal RegExp matching for better performance ([#977](https://github.com/feathersjs/feathers/issues/977)) ([3ca7e97](https://github.com/feathersjs/feathers/commit/3ca7e97)) - -# Change Log - -## [v3.0.0-pre.1](https://github.com/feathersjs/commons/tree/v3.0.0-pre.1) (2018-08-13) - -[Full Changelog](https://github.com/feathersjs/commons/compare/v2.0.0...v3.0.0-pre.1) - -**Merged pull requests:** - -- Remove argument verification and add further utilities [\#81](https://github.com/feathersjs/commons/pull/81) ([daffl](https://github.com/daffl)) - -## [v2.0.0](https://github.com/feathersjs/commons/tree/v2.0.0) (2018-08-03) - -[Full Changelog](https://github.com/feathersjs/commons/compare/v1.4.4...v2.0.0) - -**Merged pull requests:** - -- Merge major with latest changes [\#80](https://github.com/feathersjs/commons/pull/80) ([daffl](https://github.com/daffl)) -- Ability to specify custom filters in filterQuery [\#73](https://github.com/feathersjs/commons/pull/73) ([vonagam](https://github.com/vonagam)) - -## [v1.4.4](https://github.com/feathersjs/commons/tree/v1.4.4) (2018-08-01) - -[Full Changelog](https://github.com/feathersjs/commons/compare/v1.4.3...v1.4.4) - -## [v1.4.3](https://github.com/feathersjs/commons/tree/v1.4.3) (2018-07-25) - -[Full Changelog](https://github.com/feathersjs/commons/compare/v1.4.2...v1.4.3) - -**Merged pull requests:** - -- Revert breaking change from 78d780de91ae8333f3843be153beb5deea55c792 [\#78](https://github.com/feathersjs/commons/pull/78) ([daffl](https://github.com/daffl)) - -## [v1.4.2](https://github.com/feathersjs/commons/tree/v1.4.2) (2018-07-25) - -[Full Changelog](https://github.com/feathersjs/commons/compare/v1.4.1...v1.4.2) - -**Closed issues:** - -- Sort error on multiple fields [\#74](https://github.com/feathersjs/commons/issues/74) -- Cannot build with create-react-app \(again\) [\#71](https://github.com/feathersjs/commons/issues/71) - -**Merged pull requests:** - -- Update all dependencies [\#77](https://github.com/feathersjs/commons/pull/77) ([daffl](https://github.com/daffl)) -- Use sorting algorithm from NeDB [\#76](https://github.com/feathersjs/commons/pull/76) ([daffl](https://github.com/daffl)) -- Open hook workflow to custom methods [\#72](https://github.com/feathersjs/commons/pull/72) ([bertho-zero](https://github.com/bertho-zero)) - -## [v1.4.1](https://github.com/feathersjs/commons/tree/v1.4.1) (2018-04-12) - -[Full Changelog](https://github.com/feathersjs/commons/compare/v1.4.0...v1.4.1) - -**Closed issues:** - -- Uncaught ReferenceError: convertGetOrRemove is not defined [\#69](https://github.com/feathersjs/commons/issues/69) -- Cannot build with create-react-app [\#68](https://github.com/feathersjs/commons/issues/68) - -**Merged pull requests:** - -- Make conversion functions more concise [\#70](https://github.com/feathersjs/commons/pull/70) ([daffl](https://github.com/daffl)) -- Update mocha to the latest version 🚀 [\#67](https://github.com/feathersjs/commons/pull/67) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v1.4.0](https://github.com/feathersjs/commons/tree/v1.4.0) (2018-01-17) - -[Full Changelog](https://github.com/feathersjs/commons/compare/v1.3.1...v1.4.0) - -**Merged pull requests:** - -- Add ability to skip all following hooks [\#65](https://github.com/feathersjs/commons/pull/65) ([sylvainlap](https://github.com/sylvainlap)) - -## [v1.3.1](https://github.com/feathersjs/commons/tree/v1.3.1) (2018-01-12) - -[Full Changelog](https://github.com/feathersjs/commons/compare/v1.3.0...v1.3.1) - -**Merged pull requests:** - -- Allow array for sorting [\#66](https://github.com/feathersjs/commons/pull/66) ([daffl](https://github.com/daffl)) -- Update semistandard to the latest version 🚀 [\#64](https://github.com/feathersjs/commons/pull/64) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v1.3.0](https://github.com/feathersjs/commons/tree/v1.3.0) (2017-11-20) - -[Full Changelog](https://github.com/feathersjs/commons/compare/v1.2.0...v1.3.0) - -**Merged pull requests:** - -- Add a toJSON method to the hook context [\#63](https://github.com/feathersjs/commons/pull/63) ([daffl](https://github.com/daffl)) -- updating contributing guide and issue template [\#61](https://github.com/feathersjs/commons/pull/61) ([ekryski](https://github.com/ekryski)) - -## [v1.2.0](https://github.com/feathersjs/commons/tree/v1.2.0) (2017-10-25) - -[Full Changelog](https://github.com/feathersjs/commons/compare/v1.1.0...v1.2.0) - -**Merged pull requests:** - -- Bring back makeUrl [\#62](https://github.com/feathersjs/commons/pull/62) ([daffl](https://github.com/daffl)) -- adding codeclimate config [\#60](https://github.com/feathersjs/commons/pull/60) ([ekryski](https://github.com/ekryski)) - -## [v1.1.0](https://github.com/feathersjs/commons/tree/v1.1.0) (2017-10-23) - -[Full Changelog](https://github.com/feathersjs/commons/compare/v1.0.0...v1.1.0) - -**Merged pull requests:** - -- Remove unused utilities and add some inline documentation [\#59](https://github.com/feathersjs/commons/pull/59) ([daffl](https://github.com/daffl)) -- Add feathers-query-filters [\#58](https://github.com/feathersjs/commons/pull/58) ([daffl](https://github.com/daffl)) - -## [v1.0.0](https://github.com/feathersjs/commons/tree/v1.0.0) (2017-10-19) - -[Full Changelog](https://github.com/feathersjs/commons/compare/v1.0.0-pre.3...v1.0.0) - -**Merged pull requests:** - -- Rename repository and add to npm scope [\#57](https://github.com/feathersjs/commons/pull/57) ([daffl](https://github.com/daffl)) -- Updates for Feathers v3 \(Buzzard\) [\#56](https://github.com/feathersjs/commons/pull/56) ([daffl](https://github.com/daffl)) - -## [v1.0.0-pre.3](https://github.com/feathersjs/commons/tree/v1.0.0-pre.3) (2017-10-18) - -[Full Changelog](https://github.com/feathersjs/commons/compare/v1.0.0-pre.2...v1.0.0-pre.3) - -**Merged pull requests:** - -- Update the client test suite [\#55](https://github.com/feathersjs/commons/pull/55) ([daffl](https://github.com/daffl)) -- Update mocha to the latest version 🚀 [\#54](https://github.com/feathersjs/commons/pull/54) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v1.0.0-pre.2](https://github.com/feathersjs/commons/tree/v1.0.0-pre.2) (2017-07-11) - -[Full Changelog](https://github.com/feathersjs/commons/compare/v1.0.0-pre.1...v1.0.0-pre.2) - -**Merged pull requests:** - -- Update to new plugin infrastructure [\#53](https://github.com/feathersjs/commons/pull/53) ([daffl](https://github.com/daffl)) - -## [v1.0.0-pre.1](https://github.com/feathersjs/commons/tree/v1.0.0-pre.1) (2017-06-28) - -[Full Changelog](https://github.com/feathersjs/commons/compare/v0.8.7...v1.0.0-pre.1) - -**Merged pull requests:** - -- Commons for Feathers v3 [\#52](https://github.com/feathersjs/commons/pull/52) ([daffl](https://github.com/daffl)) -- Update chai to the latest version 🚀 [\#51](https://github.com/feathersjs/commons/pull/51) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update semistandard to the latest version 🚀 [\#50](https://github.com/feathersjs/commons/pull/50) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update dependencies to enable Greenkeeper 🌴 [\#49](https://github.com/feathersjs/commons/pull/49) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v0.8.7](https://github.com/feathersjs/commons/tree/v0.8.7) (2016-11-30) - -[Full Changelog](https://github.com/feathersjs/commons/compare/v0.8.6...v0.8.7) - -**Closed issues:** - -- Matcher function blows up with null values [\#46](https://github.com/feathersjs/commons/issues/46) - -**Merged pull requests:** - -- matcher now doesn't blow up with null values. Closes \#46 [\#47](https://github.com/feathersjs/commons/pull/47) ([ekryski](https://github.com/ekryski)) - -## [v0.8.6](https://github.com/feathersjs/commons/tree/v0.8.6) (2016-11-25) - -[Full Changelog](https://github.com/feathersjs/commons/compare/v0.8.5...v0.8.6) - -**Merged pull requests:** - -- Allow to pass an object to hook object [\#45](https://github.com/feathersjs/commons/pull/45) ([daffl](https://github.com/daffl)) - -## [v0.8.5](https://github.com/feathersjs/commons/tree/v0.8.5) (2016-11-19) - -[Full Changelog](https://github.com/feathersjs/commons/compare/v0.8.4...v0.8.5) - -**Merged pull requests:** - -- Deep merge and toObject [\#44](https://github.com/feathersjs/commons/pull/44) ([ekryski](https://github.com/ekryski)) -- Expose lodash functions [\#43](https://github.com/feathersjs/commons/pull/43) ([ekryski](https://github.com/ekryski)) -- Make url [\#42](https://github.com/feathersjs/commons/pull/42) ([ekryski](https://github.com/ekryski)) -- Expect syntax [\#41](https://github.com/feathersjs/commons/pull/41) ([ekryski](https://github.com/ekryski)) - -## [v0.8.4](https://github.com/feathersjs/commons/tree/v0.8.4) (2016-11-11) - -[Full Changelog](https://github.com/feathersjs/commons/compare/v0.8.3...v0.8.4) - -## [v0.8.3](https://github.com/feathersjs/commons/tree/v0.8.3) (2016-11-11) - -[Full Changelog](https://github.com/feathersjs/commons/compare/v0.8.2...v0.8.3) - -## [v0.8.2](https://github.com/feathersjs/commons/tree/v0.8.2) (2016-11-11) - -[Full Changelog](https://github.com/feathersjs/commons/compare/v0.8.1...v0.8.2) - -**Merged pull requests:** - -- One more fix for select on arrays [\#40](https://github.com/feathersjs/commons/pull/40) ([daffl](https://github.com/daffl)) - -## [v0.8.1](https://github.com/feathersjs/commons/tree/v0.8.1) (2016-11-11) - -[Full Changelog](https://github.com/feathersjs/commons/compare/v0.8.0...v0.8.1) - -**Merged pull requests:** - -- Fixing select utility methods to work with query selector [\#39](https://github.com/feathersjs/commons/pull/39) ([daffl](https://github.com/daffl)) - -## [v0.8.0](https://github.com/feathersjs/commons/tree/v0.8.0) (2016-11-09) - -[Full Changelog](https://github.com/feathersjs/commons/compare/v0.7.8...v0.8.0) - -**Merged pull requests:** - -- Implementing lodash utilities and helpers for selecting [\#38](https://github.com/feathersjs/commons/pull/38) ([daffl](https://github.com/daffl)) -- jshint —\> semistandard [\#37](https://github.com/feathersjs/commons/pull/37) ([corymsmith](https://github.com/corymsmith)) - -## [v0.7.8](https://github.com/feathersjs/commons/tree/v0.7.8) (2016-10-21) - -[Full Changelog](https://github.com/feathersjs/commons/compare/v0.7.7...v0.7.8) - -**Merged pull requests:** - -- Make getting the service in base test dynamic [\#36](https://github.com/feathersjs/commons/pull/36) ([daffl](https://github.com/daffl)) - -## [v0.7.7](https://github.com/feathersjs/commons/tree/v0.7.7) (2016-10-21) - -[Full Changelog](https://github.com/feathersjs/commons/compare/v0.7.6...v0.7.7) - -**Merged pull requests:** - -- Allow app in hookObject [\#35](https://github.com/feathersjs/commons/pull/35) ([daffl](https://github.com/daffl)) - -## [v0.7.6](https://github.com/feathersjs/commons/tree/v0.7.6) (2016-10-20) - -[Full Changelog](https://github.com/feathersjs/commons/compare/v0.7.5...v0.7.6) - -**Merged pull requests:** - -- Add test for matching and increase code coverage [\#34](https://github.com/feathersjs/commons/pull/34) ([daffl](https://github.com/daffl)) -- omit '$select' in matcher [\#33](https://github.com/feathersjs/commons/pull/33) ([beeplin](https://github.com/beeplin)) -- adding code coverage [\#32](https://github.com/feathersjs/commons/pull/32) ([ekryski](https://github.com/ekryski)) - -## [v0.7.5](https://github.com/feathersjs/commons/tree/v0.7.5) (2016-09-05) - -[Full Changelog](https://github.com/feathersjs/commons/compare/v0.7.4...v0.7.5) - -**Closed issues:** - -- Feathers should accept other type of data beside only the object type. [\#26](https://github.com/feathersjs/commons/issues/26) -- Send better error messages for method normalization [\#12](https://github.com/feathersjs/commons/issues/12) - -**Merged pull requests:** - -- Allow matching nested $or queries [\#29](https://github.com/feathersjs/commons/pull/29) ([daffl](https://github.com/daffl)) -- Add default export to `hooks.js` [\#28](https://github.com/feathersjs/commons/pull/28) ([KenanY](https://github.com/KenanY)) -- Update mocha to version 3.0.0 🚀 [\#27](https://github.com/feathersjs/commons/pull/27) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) - -## [v0.7.4](https://github.com/feathersjs/commons/tree/v0.7.4) (2016-05-29) - -[Full Changelog](https://github.com/feathersjs/commons/compare/v0.7.3...v0.7.4) - -**Merged pull requests:** - -- Use forEach instead of ES6 'for of' loop [\#25](https://github.com/feathersjs/commons/pull/25) ([lopezjurip](https://github.com/lopezjurip)) -- mocha@2.5.0 breaks build 🚨 [\#24](https://github.com/feathersjs/commons/pull/24) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Update babel-plugin-add-module-exports to version 0.2.0 🚀 [\#23](https://github.com/feathersjs/commons/pull/23) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) - -## [v0.7.3](https://github.com/feathersjs/commons/tree/v0.7.3) (2016-05-05) - -[Full Changelog](https://github.com/feathersjs/commons/compare/v0.7.2...v0.7.3) - -**Merged pull requests:** - -- Make sure arguments from hook objects are created properly for known … [\#22](https://github.com/feathersjs/commons/pull/22) ([daffl](https://github.com/daffl)) - -## [v0.7.2](https://github.com/feathersjs/commons/tree/v0.7.2) (2016-04-26) - -[Full Changelog](https://github.com/feathersjs/commons/compare/v0.7.1...v0.7.2) - -**Merged pull requests:** - -- Update test fixture to use promises and add error cases [\#19](https://github.com/feathersjs/commons/pull/19) ([daffl](https://github.com/daffl)) - -## [v0.7.1](https://github.com/feathersjs/commons/tree/v0.7.1) (2016-04-04) - -[Full Changelog](https://github.com/feathersjs/commons/compare/v0.6.2...v0.7.1) - -**Merged pull requests:** - -- Adding functionality and tests for shared query and list handling [\#17](https://github.com/feathersjs/commons/pull/17) ([daffl](https://github.com/daffl)) - -## [v0.6.2](https://github.com/feathersjs/commons/tree/v0.6.2) (2016-02-09) - -[Full Changelog](https://github.com/feathersjs/commons/compare/v0.7.0...v0.6.2) - -## [v0.7.0](https://github.com/feathersjs/commons/tree/v0.7.0) (2016-02-08) - -[Full Changelog](https://github.com/feathersjs/commons/compare/v0.6.1...v0.7.0) - -## [v0.6.1](https://github.com/feathersjs/commons/tree/v0.6.1) (2016-02-08) - -[Full Changelog](https://github.com/feathersjs/commons/compare/v0.6.0...v0.6.1) - -**Merged pull requests:** - -- Add NSP check to test script. [\#16](https://github.com/feathersjs/commons/pull/16) ([marshallswain](https://github.com/marshallswain)) - -## [v0.6.0](https://github.com/feathersjs/commons/tree/v0.6.0) (2016-01-21) - -[Full Changelog](https://github.com/feathersjs/commons/compare/v0.5.0...v0.6.0) - -**Closed issues:** - -- Rename hooks to hookUtils to make room for common hooks. [\#13](https://github.com/feathersjs/commons/issues/13) - -**Merged pull requests:** - -- Remove shared socket functionality [\#15](https://github.com/feathersjs/commons/pull/15) ([daffl](https://github.com/daffl)) -- Support socket routes with apps mounted on a path [\#14](https://github.com/feathersjs/commons/pull/14) ([daffl](https://github.com/daffl)) - -## [v0.5.0](https://github.com/feathersjs/commons/tree/v0.5.0) (2016-01-10) - -[Full Changelog](https://github.com/feathersjs/commons/compare/v0.4.0...v0.5.0) - -## [v0.4.0](https://github.com/feathersjs/commons/tree/v0.4.0) (2016-01-10) - -[Full Changelog](https://github.com/feathersjs/commons/compare/v0.3.4...v0.4.0) - -## [v0.3.4](https://github.com/feathersjs/commons/tree/v0.3.4) (2016-01-06) - -[Full Changelog](https://github.com/feathersjs/commons/compare/v0.3.3...v0.3.4) - -**Merged pull requests:** - -- Fix SocketIO client iteration for all cases [\#11](https://github.com/feathersjs/commons/pull/11) ([daffl](https://github.com/daffl)) - -## [v0.3.3](https://github.com/feathersjs/commons/tree/v0.3.3) (2016-01-06) - -[Full Changelog](https://github.com/feathersjs/commons/compare/v0.3.2...v0.3.3) - -**Closed issues:** - -- Socket.io 1.4.0 broke feathers [\#10](https://github.com/feathersjs/commons/issues/10) - -## [v0.3.2](https://github.com/feathersjs/commons/tree/v0.3.2) (2016-01-06) - -[Full Changelog](https://github.com/feathersjs/commons/compare/v0.3.1...v0.3.2) - -## [v0.3.1](https://github.com/feathersjs/commons/tree/v0.3.1) (2016-01-06) - -[Full Changelog](https://github.com/feathersjs/commons/compare/v0.3.0...v0.3.1) - -## [v0.3.0](https://github.com/feathersjs/commons/tree/v0.3.0) (2015-12-11) - -[Full Changelog](https://github.com/feathersjs/commons/compare/v0.2.11...v0.3.0) - -**Closed issues:** - -- babel inside package.json breaks react-native [\#9](https://github.com/feathersjs/commons/issues/9) - -## [v0.2.11](https://github.com/feathersjs/commons/tree/v0.2.11) (2015-11-30) - -[Full Changelog](https://github.com/feathersjs/commons/compare/v0.2.10...v0.2.11) - -**Merged pull requests:** - -- getOrRemove did not check id property type [\#8](https://github.com/feathersjs/commons/pull/8) ([daffl](https://github.com/daffl)) - -## [v0.2.10](https://github.com/feathersjs/commons/tree/v0.2.10) (2015-11-28) - -[Full Changelog](https://github.com/feathersjs/commons/compare/v0.2.9...v0.2.10) - -**Closed issues:** - -- Remove dependency on lodash [\#6](https://github.com/feathersjs/commons/issues/6) - -**Merged pull requests:** - -- Migrate to Babel 6 and remove Lodash dependency [\#7](https://github.com/feathersjs/commons/pull/7) ([daffl](https://github.com/daffl)) - -## [v0.2.9](https://github.com/feathersjs/commons/tree/v0.2.9) (2015-11-17) - -[Full Changelog](https://github.com/feathersjs/commons/compare/v0.2.8...v0.2.9) - -**Closed issues:** - -- Event dispatcher context is not being set to the service [\#5](https://github.com/feathersjs/commons/issues/5) -- .create with no callback throws error [\#4](https://github.com/feathersjs/commons/issues/4) - -## [v0.2.8](https://github.com/feathersjs/commons/tree/v0.2.8) (2015-10-06) - -[Full Changelog](https://github.com/feathersjs/commons/compare/v0.2.7...v0.2.8) - -**Closed issues:** - -- getArguments not exporting correctly [\#1](https://github.com/feathersjs/commons/issues/1) - -**Merged pull requests:** - -- Add hookObject utilities and remove Lodash dependency from arguments.js [\#3](https://github.com/feathersjs/commons/pull/3) ([daffl](https://github.com/daffl)) - -## [v0.2.7](https://github.com/feathersjs/commons/tree/v0.2.7) (2015-03-07) - -[Full Changelog](https://github.com/feathersjs/commons/compare/v0.2.6...v0.2.7) - -## [v0.2.6](https://github.com/feathersjs/commons/tree/v0.2.6) (2015-03-06) - -[Full Changelog](https://github.com/feathersjs/commons/compare/v0.2.5...v0.2.6) - -## [v0.2.5](https://github.com/feathersjs/commons/tree/v0.2.5) (2015-03-06) - -[Full Changelog](https://github.com/feathersjs/commons/compare/0.2.3...v0.2.5) - -## [0.2.3](https://github.com/feathersjs/commons/tree/0.2.3) (2015-03-06) - -[Full Changelog](https://github.com/feathersjs/commons/compare/0.2.2...0.2.3) - -## [0.2.2](https://github.com/feathersjs/commons/tree/0.2.2) (2015-03-06) - -[Full Changelog](https://github.com/feathersjs/commons/compare/0.2.1...0.2.2) - -## [0.2.1](https://github.com/feathersjs/commons/tree/0.2.1) (2015-03-06) - -[Full Changelog](https://github.com/feathersjs/commons/compare/0.2.0...0.2.1) - -## [0.2.0](https://github.com/feathersjs/commons/tree/0.2.0) (2015-03-06) - -[Full Changelog](https://github.com/feathersjs/commons/compare/0.1.0...0.2.0) - -## [0.1.0](https://github.com/feathersjs/commons/tree/0.1.0) (2015-03-06) - -\* _This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)_ diff --git a/packages/commons/LICENSE b/packages/commons/LICENSE deleted file mode 100644 index 7712f870f3..0000000000 --- a/packages/commons/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2024 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 -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -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 deleted file mode 100644 index 2eefb2bb7f..0000000000 --- a/packages/commons/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# Feathers Commons - -[![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/commons.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/commons) -[![Discord](https://badgen.net/badge/icon/discord?icon=discord&label)](https://discord.gg/qa8kez8QBx) - -> Shared Feathers utility functions - -## Installation - -``` -npm install @feathersjs/commons --save -``` - -## Documentation - -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) - -Licensed under the [MIT license](LICENSE). diff --git a/packages/commons/package.json b/packages/commons/package.json deleted file mode 100644 index b7e826dca4..0000000000 --- a/packages/commons/package.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "name": "@feathersjs/commons", - "version": "5.0.34", - "description": "Shared Feathers utility functions", - "homepage": "https://feathersjs.com", - "keywords": [ - "feathers" - ], - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/daffl" - }, - "repository": { - "type": "git", - "url": "git://github.com/feathersjs/feathers.git", - "directory": "packages/commons" - }, - "author": { - "name": "Feathers contributor", - "email": "hello@feathersjs.com", - "url": "https://feathersjs.com" - }, - "contributors": [], - "bugs": { - "url": "https://github.com/feathersjs/feathers/issues" - }, - "engines": { - "node": ">= 12" - }, - "main": "lib/", - "types": "lib/", - "files": [ - "CHANGELOG.md", - "LICENSE", - "README.md", - "src/**", - "lib/**", - "*.d.ts", - "*.js" - ], - "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" - }, - "directories": { - "lib": "lib" - }, - "publishConfig": { - "access": "public" - }, - "devDependencies": { - "@types/mocha": "^10.0.10", - "@types/node": "^24.1.0", - "mocha": "^11.7.1", - "shx": "^0.4.0", - "ts-node": "^10.9.2", - "typescript": "^5.9.2" - }, - "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" -} diff --git a/packages/commons/test/module.test.ts b/packages/commons/test/module.test.ts deleted file mode 100644 index 06198d039e..0000000000 --- a/packages/commons/test/module.test.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { strict as assert } from 'assert' -import { _ } from '../src' - -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') - assert.equal(typeof _.every, 'function') - assert.equal(typeof _.keys, 'function') - assert.equal(typeof _.values, 'function') - assert.equal(typeof _.isMatch, 'function') - assert.equal(typeof _.isEmpty, 'function') - assert.equal(typeof _.isObject, 'function') - assert.equal(typeof _.extend, 'function') - assert.equal(typeof _.omit, 'function') - assert.equal(typeof _.pick, 'function') - assert.equal(typeof _.merge, 'function') - }) -}) diff --git a/packages/commons/tsconfig.json b/packages/commons/tsconfig.json deleted file mode 100644 index 316fd41336..0000000000 --- a/packages/commons/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig", - "include": [ - "src/**/*.ts" - ], - "compilerOptions": { - "outDir": "lib" - } -} diff --git a/packages/configuration/CHANGELOG.md b/packages/configuration/CHANGELOG.md deleted file mode 100644 index e40797dcf3..0000000000 --- a/packages/configuration/CHANGELOG.md +++ /dev/null @@ -1,735 +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.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/configuration - -## [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/configuration - -## [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/configuration - -## [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/configuration - -## [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/configuration - -## [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/configuration - -## [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/configuration - -## [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/configuration - -## [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/configuration - -## [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/configuration - -## [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/configuration - -## [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/configuration - -## [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/configuration - -## [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/configuration - -## [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/configuration - -## [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/configuration - -## [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/configuration - -## [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/configuration - -## [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/configuration - -## [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/configuration - -## [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/configuration - -## [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/configuration - -## [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/configuration - -## [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/configuration - -## [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/configuration - -## [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/configuration - -# [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/configuration - -# [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/configuration - -# [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/configuration - -# [5.0.0-pre.36](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.35...v5.0.0-pre.36) (2023-01-29) - -### Bug Fixes - -- Update all dependencies ([#3024](https://github.com/feathersjs/feathers/issues/3024)) ([283dc47](https://github.com/feathersjs/feathers/commit/283dc4798d85584bc031e6e54b83b4ea77d1edd0)) - -# [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/configuration - -# [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/configuration - -# [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/configuration - -# [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 @feathersjs/configuration - -# [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)) -- **schema:** Make schemas validation library independent and add TypeBox support ([#2772](https://github.com/feathersjs/feathers/issues/2772)) ([44172d9](https://github.com/feathersjs/feathers/commit/44172d99b566d11d9ceda04f1d0bf72b6d05ce76)) - -# [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/configuration - -# [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/configuration - -# [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/configuration - -# [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/configuration - -# [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/configuration - -# [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/configuration - -# [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/configuration - -# [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/configuration - -# [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 - -- **configuration:** Only validate the initial configuration against the schema ([#2622](https://github.com/feathersjs/feathers/issues/2622)) ([386c5e2](https://github.com/feathersjs/feathers/commit/386c5e2e67bfad4fb4333f2e3e17f7d7e09ac27e)) -- **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/configuration - -# [5.0.0-pre.18](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.17...v5.0.0-pre.18) (2022-04-11) - -### Features - -- **configuration:** Allow app configuration to be validated against a schema ([#2590](https://github.com/feathersjs/feathers/issues/2590)) ([a268f86](https://github.com/feathersjs/feathers/commit/a268f86da92a8ada14ed11ab456aac0a4bba5bb0)) - -# [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/configuration - -# [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/configuration - -# [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/configuration - -# [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/configuration - -# [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/configuration - -# [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/configuration - -# [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/configuration - -# [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/configuration - -# [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/configuration - -# [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/configuration - -# [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/configuration - -# [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/configuration - -# [5.0.0-pre.5](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.4...v5.0.0-pre.5) (2021-06-23) - -### Bug Fixes - -- **koa:** Use extended query parser for compatibility ([#2397](https://github.com/feathersjs/feathers/issues/2397)) ([b2944ba](https://github.com/feathersjs/feathers/commit/b2944bac3ec6d5ecc80dc518cd4e58093692db74)) - -# [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/configuration - -# [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)) - -### Features - -- **dependencies:** Remove direct debug dependency ([#2296](https://github.com/feathersjs/feathers/issues/2296)) ([501d416](https://github.com/feathersjs/feathers/commit/501d4164d30c6a126906dc640cdfdc82207ba34a)) - -# [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/configuration - -# [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/configuration - -# [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)) - -### Features - -- Feathers v5 core refactoring and features ([#2255](https://github.com/feathersjs/feathers/issues/2255)) ([2dafb7c](https://github.com/feathersjs/feathers/commit/2dafb7ce14ba57406aeec13d10ca45b1e709bee9)) - -# [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) - -### chore - -- **configuration:** Remove environment variable substitution ([#1942](https://github.com/feathersjs/feathers/issues/1942)) ([caaa21f](https://github.com/feathersjs/feathers/commit/caaa21ffdc6a8dcac82fb403c91d9d4b781a6c0a)) - -### BREAKING CHANGES - -- **configuration:** Falls back to node-config instead of adding additional - functionality like path replacements and automatic environment variable insertion. - -# [5.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v4.5.4...v5.0.0-pre.0) (2020-05-19) - -### chore - -- **configuration:** Remove environment variable substitution ([#1942](https://github.com/feathersjs/feathers/issues/1942)) ([caaa21f](https://github.com/feathersjs/feathers/commit/caaa21ffdc6a8dcac82fb403c91d9d4b781a6c0a)) - -### BREAKING CHANGES - -- **configuration:** Falls back to node-config instead of adding additional - functionality like path replacements and automatic environment variable insertion. - -## [4.5.9](https://github.com/feathersjs/feathers/compare/v4.5.8...v4.5.9) (2020-10-09) - -### Bug Fixes - -- **configuration:** Fix handling of config values that start with . or .. but are not actually relative paths; e.g. ".foo" or "..bar" ([#2065](https://github.com/feathersjs/feathers/issues/2065)) ([d07bf59](https://github.com/feathersjs/feathers/commit/d07bf5902e9c8c606f16b9523472972d3d2e9b49)) - -## [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/configuration - -## [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/configuration - -## [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/configuration - -## [4.5.3](https://github.com/feathersjs/feathers/compare/v4.5.2...v4.5.3) (2020-04-17) - -**Note:** Version bump only for package @feathersjs/configuration - -## [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/configuration - -## [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/configuration - -# [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/configuration - -## [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/configuration - -## [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/configuration - -# [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/configuration - -## [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/configuration - -## [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/configuration - -## [4.3.9](https://github.com/feathersjs/feathers/compare/v4.3.8...v4.3.9) (2019-10-26) - -**Note:** Version bump only for package @feathersjs/configuration - -## [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/configuration - -## [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/configuration - -## [4.3.3](https://github.com/feathersjs/feathers/compare/v4.3.2...v4.3.3) (2019-09-21) - -### Bug Fixes - -- Small improvements in dependencies and code sturcture ([#1562](https://github.com/feathersjs/feathers/issues/1562)) ([42c13e2](https://github.com/feathersjs/feathers/commit/42c13e2)) - -## [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/configuration - -## [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/configuration - -# [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/configuration - -# [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/configuration - -# [4.3.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.2...v4.3.0-pre.3) (2019-08-19) - -### Bug Fixes - -- Update all dependencies ([7d53a00](https://github.com/feathersjs/feathers/commit/7d53a00)) - -# [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/configuration - -# [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/configuration - -# [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/configuration - -# [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/configuration - -# [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) - -**Note:** Version bump only for package @feathersjs/configuration - -# [4.0.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.0...v4.0.0-pre.1) (2019-05-08) - -**Note:** Version bump only for package @feathersjs/configuration - -# [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 - -- Update all dependencies to latest ([#1206](https://github.com/feathersjs/feathers/issues/1206)) ([e51e0f6](https://github.com/feathersjs/feathers/commit/e51e0f6)) -- **package:** update config to version 3.0.0 ([#1100](https://github.com/feathersjs/feathers/issues/1100)) ([c9f4b42](https://github.com/feathersjs/feathers/commit/c9f4b42)) -- Make Mocha a proper devDependency for every repository ([#1053](https://github.com/feathersjs/feathers/issues/1053)) ([9974803](https://github.com/feathersjs/feathers/commit/9974803)) -- **package:** update debug to version 3.0.0 ([#45](https://github.com/feathersjs/feathers/issues/45)) ([2391434](https://github.com/feathersjs/feathers/commit/2391434)) -- **package:** update debug to version 3.0.1 ([#46](https://github.com/feathersjs/feathers/issues/46)) ([f8ada69](https://github.com/feathersjs/feathers/commit/f8ada69)) - -### Features - -- Add TypeScript definitions ([#1275](https://github.com/feathersjs/feathers/issues/1275)) ([9dd6713](https://github.com/feathersjs/feathers/commit/9dd6713)) - -## [2.0.6](https://github.com/feathersjs/feathers/compare/@feathersjs/configuration@2.0.5...@feathersjs/configuration@2.0.6) (2019-01-02) - -**Note:** Version bump only for package @feathersjs/configuration - - - -## [2.0.5](https://github.com/feathersjs/feathers/compare/@feathersjs/configuration@2.0.4...@feathersjs/configuration@2.0.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)) -- **package:** update config to version 3.0.0 ([#1100](https://github.com/feathersjs/feathers/issues/1100)) ([c9f4b42](https://github.com/feathersjs/feathers/commit/c9f4b42)) - - - -## [2.0.4](https://github.com/feathersjs/feathers/compare/@feathersjs/configuration@2.0.3...@feathersjs/configuration@2.0.4) (2018-09-21) - -**Note:** Version bump only for package @feathersjs/configuration - - - -## [2.0.3](https://github.com/feathersjs/feathers/compare/@feathersjs/configuration@2.0.2...@feathersjs/configuration@2.0.3) (2018-09-17) - -**Note:** Version bump only for package @feathersjs/configuration - - - -## [2.0.2](https://github.com/feathersjs/feathers/compare/@feathersjs/configuration@2.0.1...@feathersjs/configuration@2.0.2) (2018-09-02) - -**Note:** Version bump only for package @feathersjs/configuration - - - -## 2.0.1 - -- Migrate to Monorepo ([feathers#462](https://github.com/feathersjs/feathers/issues/462)) - -## [v2.0.0](https://github.com/feathersjs/configuration/tree/v2.0.0) (2018-07-30) - -[Full Changelog](https://github.com/feathersjs/configuration/compare/v1.0.2...v2.0.0) - -**Closed issues:** - -- Config adding a value of userName in runtime its overwritten to the OS name [\#58](https://github.com/feathersjs/configuration/issues/58) -- Configuration Management [\#26](https://github.com/feathersjs/configuration/issues/26) - -**Merged pull requests:** - -- Update config to the latest version 🚀 [\#59](https://github.com/feathersjs/configuration/pull/59) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- misspelling [\#57](https://github.com/feathersjs/configuration/pull/57) ([chaintng](https://github.com/chaintng)) -- Update mocha to the latest version 🚀 [\#56](https://github.com/feathersjs/configuration/pull/56) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v1.0.2](https://github.com/feathersjs/configuration/tree/v1.0.2) (2018-01-02) - -[Full Changelog](https://github.com/feathersjs/configuration/compare/v1.0.1...v1.0.2) - -**Merged pull requests:** - -- Remove example and update Readme to point directly to the Feathers docs [\#55](https://github.com/feathersjs/configuration/pull/55) ([daffl](https://github.com/daffl)) - -## [v1.0.1](https://github.com/feathersjs/configuration/tree/v1.0.1) (2017-11-16) - -[Full Changelog](https://github.com/feathersjs/configuration/compare/v1.0.0...v1.0.1) - -**Merged pull requests:** - -- Add default export for better ES module \(TypeScript\) compatibility [\#53](https://github.com/feathersjs/configuration/pull/53) ([daffl](https://github.com/daffl)) -- Update nsp to the latest version 🚀 [\#52](https://github.com/feathersjs/configuration/pull/52) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v1.0.0](https://github.com/feathersjs/configuration/tree/v1.0.0) (2017-11-01) - -[Full Changelog](https://github.com/feathersjs/configuration/compare/v1.0.0-pre.1...v1.0.0) - -## [v1.0.0-pre.1](https://github.com/feathersjs/configuration/tree/v1.0.0-pre.1) (2017-10-23) - -[Full Changelog](https://github.com/feathersjs/configuration/compare/v0.4.2...v1.0.0-pre.1) - -**Closed issues:** - -- Move config options to app.config instead of the Express app object. [\#31](https://github.com/feathersjs/configuration/issues/31) - -**Merged pull requests:** - -- Update to new plugin infrastructure and npm scopes [\#51](https://github.com/feathersjs/configuration/pull/51) ([daffl](https://github.com/daffl)) - -## [v0.4.2](https://github.com/feathersjs/configuration/tree/v0.4.2) (2017-10-15) - -[Full Changelog](https://github.com/feathersjs/configuration/compare/v0.4.1...v0.4.2) - -**Closed issues:** - -- Missing TypeScript declaration file [\#48](https://github.com/feathersjs/configuration/issues/48) -- Feathers writing in typescript fails to boot on configuration [\#47](https://github.com/feathersjs/configuration/issues/47) -- Prevent automatic expansion of environment variables [\#42](https://github.com/feathersjs/configuration/issues/42) -- Getting Env name [\#41](https://github.com/feathersjs/configuration/issues/41) -- Nested configuration [\#38](https://github.com/feathersjs/configuration/issues/38) -- Stuck in configuration loophole... [\#37](https://github.com/feathersjs/configuration/issues/37) -- Docs are wrong [\#36](https://github.com/feathersjs/configuration/issues/36) -- Why use "NODE_ENV=development" with default.json? [\#33](https://github.com/feathersjs/configuration/issues/33) - -**Merged pull requests:** - -- Create TypeScript definitions [\#50](https://github.com/feathersjs/configuration/pull/50) ([jhanschoo](https://github.com/jhanschoo)) -- Update mocha to the latest version 🚀 [\#49](https://github.com/feathersjs/configuration/pull/49) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update debug to the latest version 🚀 [\#46](https://github.com/feathersjs/configuration/pull/46) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update debug to the latest version 🚀 [\#45](https://github.com/feathersjs/configuration/pull/45) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Grammatical change [\#44](https://github.com/feathersjs/configuration/pull/44) ([eugeniaguerrero](https://github.com/eugeniaguerrero)) -- More documentation on using and escaping environment variables [\#43](https://github.com/feathersjs/configuration/pull/43) ([daffl](https://github.com/daffl)) -- Update semistandard to the latest version 🚀 [\#40](https://github.com/feathersjs/configuration/pull/40) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update dependencies to enable Greenkeeper 🌴 [\#39](https://github.com/feathersjs/configuration/pull/39) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Fix first example [\#35](https://github.com/feathersjs/configuration/pull/35) ([elfey](https://github.com/elfey)) -- 👻😱 Node.js 0.10 is unmaintained 😱👻 [\#30](https://github.com/feathersjs/configuration/pull/30) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) - -## [v0.4.1](https://github.com/feathersjs/configuration/tree/v0.4.1) (2016-10-24) - -[Full Changelog](https://github.com/feathersjs/configuration/compare/v0.4.0...v0.4.1) - -**Closed issues:** - -- Investigate node-config [\#8](https://github.com/feathersjs/configuration/issues/8) - -**Merged pull requests:** - -- update readme [\#29](https://github.com/feathersjs/configuration/pull/29) ([slajax](https://github.com/slajax)) -- jshint —\> semistandard [\#28](https://github.com/feathersjs/configuration/pull/28) ([corymsmith](https://github.com/corymsmith)) - -## [v0.4.0](https://github.com/feathersjs/configuration/tree/v0.4.0) (2016-10-22) - -[Full Changelog](https://github.com/feathersjs/configuration/compare/v0.3.3...v0.4.0) - -**Implemented enhancements:** - -- implement node-config [\#27](https://github.com/feathersjs/configuration/pull/27) ([slajax](https://github.com/slajax)) - -**Closed issues:** - -- Deprecate v1 in favour of node-config [\#25](https://github.com/feathersjs/configuration/issues/25) -- Make this repo more about managing configuration [\#24](https://github.com/feathersjs/configuration/issues/24) - -## [v0.3.3](https://github.com/feathersjs/configuration/tree/v0.3.3) (2016-09-12) - -[Full Changelog](https://github.com/feathersjs/configuration/compare/v0.3.2...v0.3.3) - -## [v0.3.2](https://github.com/feathersjs/configuration/tree/v0.3.2) (2016-09-12) - -[Full Changelog](https://github.com/feathersjs/configuration/compare/v0.3.1...v0.3.2) - -**Closed issues:** - -- A way to have local override [\#20](https://github.com/feathersjs/configuration/issues/20) - -**Merged pull requests:** - -- Remove check for development mode [\#21](https://github.com/feathersjs/configuration/pull/21) ([daffl](https://github.com/daffl)) - -## [v0.3.1](https://github.com/feathersjs/configuration/tree/v0.3.1) (2016-08-15) - -[Full Changelog](https://github.com/feathersjs/configuration/compare/v0.3.0...v0.3.1) - -**Merged pull requests:** - -- Support `null` values [\#19](https://github.com/feathersjs/configuration/pull/19) ([KenanY](https://github.com/KenanY)) -- Update mocha to version 3.0.0 🚀 [\#18](https://github.com/feathersjs/configuration/pull/18) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) - -## [v0.3.0](https://github.com/feathersjs/configuration/tree/v0.3.0) (2016-05-22) - -[Full Changelog](https://github.com/feathersjs/configuration/compare/v0.2.3...v0.3.0) - -**Closed issues:** - -- \.json config need deep merge options [\#16](https://github.com/feathersjs/configuration/issues/16) - -**Merged pull requests:** - -- Add functionality for deeply extending configuration [\#17](https://github.com/feathersjs/configuration/pull/17) ([daffl](https://github.com/daffl)) - -## [v0.2.3](https://github.com/feathersjs/configuration/tree/v0.2.3) (2016-04-24) - -[Full Changelog](https://github.com/feathersjs/configuration/compare/v0.2.2...v0.2.3) - -**Closed issues:** - -- PR: Support modules in config [\#12](https://github.com/feathersjs/configuration/issues/12) - -**Merged pull requests:** - -- Support modules as configuration files. [\#13](https://github.com/feathersjs/configuration/pull/13) ([wkw](https://github.com/wkw)) -- Update all dependencies 🌴 [\#10](https://github.com/feathersjs/configuration/pull/10) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) - -## [v0.2.2](https://github.com/feathersjs/configuration/tree/v0.2.2) (2016-03-27) - -[Full Changelog](https://github.com/feathersjs/configuration/compare/v0.2.1...v0.2.2) - -**Merged pull requests:** - -- Expanding environment variables in \.json [\#9](https://github.com/feathersjs/configuration/pull/9) ([derek-watson](https://github.com/derek-watson)) - -## [v0.2.1](https://github.com/feathersjs/configuration/tree/v0.2.1) (2016-03-12) - -[Full Changelog](https://github.com/feathersjs/configuration/compare/v0.2.0...v0.2.1) - -**Merged pull requests:** - -- Makes sure that arrays get converted properly [\#7](https://github.com/feathersjs/configuration/pull/7) ([daffl](https://github.com/daffl)) - -## [v0.2.0](https://github.com/feathersjs/configuration/tree/v0.2.0) (2016-03-09) - -[Full Changelog](https://github.com/feathersjs/configuration/compare/v0.1.1...v0.2.0) - -**Closed issues:** - -- Needs an escape character [\#4](https://github.com/feathersjs/configuration/issues/4) - -**Merged pull requests:** - -- Implement an escape character [\#6](https://github.com/feathersjs/configuration/pull/6) ([daffl](https://github.com/daffl)) - -## [v0.1.1](https://github.com/feathersjs/configuration/tree/v0.1.1) (2016-03-09) - -[Full Changelog](https://github.com/feathersjs/configuration/compare/v0.1.0...v0.1.1) - -**Closed issues:** - -- Configuration should recursively go through the values [\#2](https://github.com/feathersjs/configuration/issues/2) - -**Merged pull requests:** - -- Replace slashes in paths with the separator [\#5](https://github.com/feathersjs/configuration/pull/5) ([daffl](https://github.com/daffl)) -- Allow to convert deeply nested environment variables [\#3](https://github.com/feathersjs/configuration/pull/3) ([daffl](https://github.com/daffl)) -- Adding nsp check [\#1](https://github.com/feathersjs/configuration/pull/1) ([marshallswain](https://github.com/marshallswain)) - -## [v0.1.0](https://github.com/feathersjs/configuration/tree/v0.1.0) (2015-11-14) - -\* _This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)_ diff --git a/packages/configuration/LICENSE b/packages/configuration/LICENSE deleted file mode 100644 index 7712f870f3..0000000000 --- a/packages/configuration/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2024 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 -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -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 deleted file mode 100644 index 6e81d7cdb5..0000000000 --- a/packages/configuration/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# @feathersjs/configuration - -[![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/@feathersjs/configuration) -[![Discord](https://badgen.net/badge/icon/discord?icon=discord&label)](https://discord.gg/qa8kez8QBx) - -> A small configuration module for your Feathers application. - -## Installation - -``` -npm install @feathersjs/configuration --save -``` - -## Documentation - -Refer to the [Feathers configuration API documentation](https://feathersjs.com/api/configuration.html) 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/configuration/package.json b/packages/configuration/package.json deleted file mode 100644 index e00b65ff31..0000000000 --- a/packages/configuration/package.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "name": "@feathersjs/configuration", - "description": "A small configuration module for your Feathers application.", - "version": "5.0.34", - "homepage": "https://feathersjs.com", - "main": "lib/", - "types": "lib/", - "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", - "directory": "packages/configuration" - }, - "author": { - "name": "Feathers contributors", - "email": "hello@feathersjs.com", - "url": "https://feathersjs.com" - }, - "contributors": [], - "bugs": { - "url": "https://github.com/feathersjs/feathers/issues" - }, - "engines": { - "node": ">= 12" - }, - "files": [ - "CHANGELOG.md", - "LICENSE", - "README.md", - "src/**", - "lib/**", - "*.d.ts", - "*.js" - ], - "scripts": { - "prepublish": "npm run compile", - "pack": "npm pack --pack-destination ../generators/test/build", - "compile": "shx rm -rf lib/ && tsc && npm run pack", - "test": "NODE_CONFIG_DIR=./test/config mocha --config ../../.mocharc.json --recursive test/**.test.ts test/**/*.test.ts" - }, - "semistandard": { - "env": [ - "mocha" - ] - }, - "directories": { - "lib": "lib" - }, - "publishConfig": { - "access": "public" - }, - "dependencies": { - "@feathersjs/commons": "^5.0.34", - "@feathersjs/feathers": "^5.0.34", - "@feathersjs/schema": "^5.0.34", - "@types/config": "^3.3.5", - "config": "^4.1.0" - }, - "devDependencies": { - "@types/mocha": "^10.0.10", - "@types/node": "^24.1.0", - "mocha": "^11.7.1", - "shx": "^0.4.0", - "ts-node": "^10.9.2", - "typescript": "^5.9.2" - }, - "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" -} diff --git a/packages/configuration/src/index.ts b/packages/configuration/src/index.ts deleted file mode 100644 index a34606d679..0000000000 --- a/packages/configuration/src/index.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { Application, ApplicationHookContext, NextFunction } from '@feathersjs/feathers' -import { createDebug } from '@feathersjs/commons' -import { Schema, Validator } from '@feathersjs/schema' -import config from 'config' - -const debug = createDebug('@feathersjs/configuration') - -export = function init(schema?: Schema | Validator) { - const validator: Validator = typeof schema === 'function' ? schema : schema?.validate.bind(schema) - - return (app?: Application) => { - if (!app) { - return config - } - - const configuration: { [key: string]: unknown } = { ...config } - - debug(`Initializing configuration for ${config.util.getEnv('NODE_ENV')} environment`) - - Object.keys(configuration).forEach((name) => { - const value = configuration[name] - debug(`Setting ${name} configuration value to`, value) - app.set(name, value) - }) - - if (validator) { - app.hooks({ - setup: [ - async (_context: ApplicationHookContext, next: NextFunction) => { - await validator(configuration) - await next() - } - ] - }) - } - - return config - } -} diff --git a/packages/configuration/test/config/default.json b/packages/configuration/test/config/default.json deleted file mode 100644 index 8e3ede2021..0000000000 --- a/packages/configuration/test/config/default.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "port": 3030, - "array": ["one", "two", "three"], - "deep": { "base": false }, - "nullish": null -} diff --git a/packages/configuration/test/index.test.ts b/packages/configuration/test/index.test.ts deleted file mode 100644 index 65fc1c8d14..0000000000 --- a/packages/configuration/test/index.test.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { strict as assert } from 'assert' -import { feathers, Application } from '@feathersjs/feathers' -import { Ajv, schema } from '@feathersjs/schema' -import configuration from '../src' - -describe('@feathersjs/configuration', () => { - const app: Application = feathers().configure(configuration()) - - it('initialized app with default.json', () => { - assert.equal(app.get('port'), 3030) - assert.deepEqual(app.get('array'), ['one', 'two', 'three']) - assert.deepEqual(app.get('deep'), { base: false }) - assert.deepEqual(app.get('nullish'), null) - }) - - it('works when called directly', () => { - const fn = configuration() - const conf = fn() as any - - assert.strictEqual(conf.port, 3030) - }) - - it('errors on .setup when a schema is passed and the configuration is invalid', async () => { - const configurationSchema = schema( - { - $id: 'ConfigurationSchema', - additionalProperties: false, - type: 'object', - properties: { - port: { type: 'number' }, - deep: { - type: 'object', - properties: { - base: { - type: 'boolean' - } - } - }, - array: { - type: 'array', - items: { type: 'string' } - }, - nullish: { - type: 'string' - } - } - } as const, - new Ajv() - ) - - const schemaApp = feathers().configure(configuration(configurationSchema)) - - await assert.rejects(() => schemaApp.setup(), { - data: [ - { - instancePath: '/nullish', - keyword: 'type', - message: 'must be string', - params: { - type: 'string' - }, - schemaPath: '#/properties/nullish/type' - } - ] - }) - }) -}) diff --git a/packages/configuration/tsconfig.json b/packages/configuration/tsconfig.json deleted file mode 100644 index 316fd41336..0000000000 --- a/packages/configuration/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig", - "include": [ - "src/**/*.ts" - ], - "compilerOptions": { - "outDir": "lib" - } -} diff --git a/packages/create-feathers/CHANGELOG.md b/packages/create-feathers/CHANGELOG.md index 5fc4f4d87b..a5f8a365e3 100644 --- a/packages/create-feathers/CHANGELOG.md +++ b/packages/create-feathers/CHANGELOG.md @@ -3,6 +3,24 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [6.0.0-pre.3](https://github.com/feathersjs/feathers/compare/v6.0.0-pre.2...v6.0.0-pre.3) (2025-10-10) + +**Note:** Version bump only for package create-feathers + +# [6.0.0-pre.2](https://github.com/feathersjs/feathers/compare/v6.0.0-pre.1...v6.0.0-pre.2) (2025-09-04) + +**Note:** Version bump only for package create-feathers + +# [6.0.0-pre.1](https://github.com/feathersjs/feathers/compare/v6.0.0-pre.0...v6.0.0-pre.1) (2025-09-03) + +**Note:** Version bump only for package create-feathers + +# [6.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v5.0.34...v6.0.0-pre.0) (2025-08-30) + +### Features + +- V6 packages refactor ([#3596](https://github.com/feathersjs/feathers/issues/3596)) ([364aab5](https://github.com/feathersjs/feathers/commit/364aab563542fc9d6dd96c1f5f48b146727d7d1e)) + ## [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 diff --git a/packages/create-feathers/package.json b/packages/create-feathers/package.json index 5b5600806d..8dd4dfee44 100644 --- a/packages/create-feathers/package.json +++ b/packages/create-feathers/package.json @@ -1,7 +1,7 @@ { "name": "create-feathers", "description": "Create a new Feathers application", - "version": "5.0.34", + "version": "6.0.0-pre.3", "homepage": "https://feathersjs.com", "bin": { "create-feathers": "./bin/create-feathers.js" @@ -50,5 +50,8 @@ "dependencies": { "@feathersjs/cli": "^5.0.34" }, - "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" + "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5", + "devDependencies": { + "vitest": "^3.2.4" + } } diff --git a/packages/errors/CHANGELOG.md b/packages/errors/CHANGELOG.md deleted file mode 100644 index fcac0bf016..0000000000 --- a/packages/errors/CHANGELOG.md +++ /dev/null @@ -1,1021 +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.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/packages/errors/LICENSE b/packages/errors/LICENSE deleted file mode 100644 index 7712f870f3..0000000000 --- a/packages/errors/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2024 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 -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -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 deleted file mode 100644 index 1b76126634..0000000000 --- a/packages/errors/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# @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) 2024 [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 deleted file mode 100644 index 8f51e60279..0000000000 --- a/packages/errors/package.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "name": "@feathersjs/errors", - "description": "Common error types for Feathers apps", - "version": "5.0.34", - "homepage": "https://feathersjs.com", - "main": "lib/", - "types": "lib/", - "keywords": [ - "feathers", - "feathers-plugin" - ], - "license": "MIT", - "repository": { - "type": "git", - "url": "git://github.com/feathersjs/feathers.git", - "directory": "packages/errors" - }, - "author": { - "name": "Feathers contributors", - "email": "hello@feathersjs.com", - "url": "https://feathersjs.com" - }, - "contributors": [], - "bugs": { - "url": "https://github.com/feathersjs/feathers/issues" - }, - "engines": { - "node": ">= 12" - }, - "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": { - "@feathersjs/feathers": "^5.0.34", - "@types/mocha": "^10.0.10", - "@types/node": "^24.1.0", - "mocha": "^11.7.1", - "shx": "^0.4.0", - "ts-node": "^10.9.2", - "typescript": "^5.9.2" - }, - "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" -} diff --git a/packages/errors/tsconfig.json b/packages/errors/tsconfig.json deleted file mode 100644 index 316fd41336..0000000000 --- a/packages/errors/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig", - "include": [ - "src/**/*.ts" - ], - "compilerOptions": { - "outDir": "lib" - } -} diff --git a/packages/express/CHANGELOG.md b/packages/express/CHANGELOG.md deleted file mode 100644 index ad652d47f4..0000000000 --- a/packages/express/CHANGELOG.md +++ /dev/null @@ -1,761 +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.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/express - -## [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)) -- **express:** Update express to version 4.21.1 ([#3543](https://github.com/feathersjs/feathers/issues/3543)) ([56d6151](https://github.com/feathersjs/feathers/commit/56d6151624f083d6604e76746cf555ed846b6d40)) - -## [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/express - -## [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/express - -## [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/express - -## [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/express - -## [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/express - -## [5.0.25](https://github.com/feathersjs/feathers/compare/v5.0.24...v5.0.25) (2024-05-03) - -### Bug Fixes - -- Reduce usage of lodash ([#3455](https://github.com/feathersjs/feathers/issues/3455)) ([8ce807a](https://github.com/feathersjs/feathers/commit/8ce807a5ca53ff5b8d5107a0656c6329404e6e6c)) - -## [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/express - -## [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/express - -## [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/express - -## [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/express - -## [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/express - -## [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/express - -## [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/express - -## [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/express - -## [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/express - -## [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/express - -## [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/express - -## [5.0.12](https://github.com/feathersjs/feathers/compare/v5.0.11...v5.0.12) (2023-11-28) - -### Bug Fixes - -- **express:** Re-export Router ([#3349](https://github.com/feathersjs/feathers/issues/3349)) ([0cbdb03](https://github.com/feathersjs/feathers/commit/0cbdb03a2d810f4855da9b21602c96e4fed7fce5)) - -## [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/express - -## [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/express - -## [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/express - -## [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/express - -## [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/express - -## [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/express - -## [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/express - -# [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/express - -# [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/express - -# [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/express - -# [5.0.0-pre.36](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.35...v5.0.0-pre.36) (2023-01-29) - -### Bug Fixes - -- Update all dependencies ([#3024](https://github.com/feathersjs/feathers/issues/3024)) ([283dc47](https://github.com/feathersjs/feathers/commit/283dc4798d85584bc031e6e54b83b4ea77d1edd0)) - -# [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) - -### Bug Fixes - -- **core:** `context.type` for around hooks ([#2890](https://github.com/feathersjs/feathers/issues/2890)) ([d606ac6](https://github.com/feathersjs/feathers/commit/d606ac660fd5335c95206784fea36530dd2e851a)) - -# [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/express - -# [5.0.0-pre.32](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.31...v5.0.0-pre.32) (2022-10-26) - -### Bug Fixes - -- **docs:** Review transport API docs and update Express middleware setup ([#2811](https://github.com/feathersjs/feathers/issues/2811)) ([1b97f14](https://github.com/feathersjs/feathers/commit/1b97f14d474f5613482f259eeaa585c24fcfab43)) -- **transports:** Add remaining middleware for generated apps to Koa and Express ([#2796](https://github.com/feathersjs/feathers/issues/2796)) ([0d5781a](https://github.com/feathersjs/feathers/commit/0d5781a5c72a0cbb2ec8211bfa099f0aefe115a2)) - -# [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 @feathersjs/express - -# [5.0.0-pre.30](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.29...v5.0.0-pre.30) (2022-10-07) - -### Bug Fixes - -- **core:** Ensure setup and teardown can be overriden and maintain hook functionality ([#2779](https://github.com/feathersjs/feathers/issues/2779)) ([ab580cb](https://github.com/feathersjs/feathers/commit/ab580cbcaa68d19144d86798c13bf564f9d424a6)) - -### 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) - -### Features - -- Add CORS support to oAuth, Express, Koa and generated application ([#2744](https://github.com/feathersjs/feathers/issues/2744)) ([fd218f2](https://github.com/feathersjs/feathers/commit/fd218f289f8ca4c101e9938e8683e2efef6e8131)) -- **authentication-oauth:** Koa and transport independent oAuth authentication ([#2737](https://github.com/feathersjs/feathers/issues/2737)) ([9231525](https://github.com/feathersjs/feathers/commit/9231525a24bb790ba9c5d940f2867a9c727691c9)) - -# [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/express - -# [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/express - -# [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/express - -# [5.0.0-pre.24](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.23...v5.0.0-pre.24) (2022-06-21) - -### Bug Fixes - -- **authentication:** Add safe dispatch data for authentication requests ([#2662](https://github.com/feathersjs/feathers/issues/2662)) ([d8104a1](https://github.com/feathersjs/feathers/commit/d8104a19ee9181e6a5ea81014af29ff9a3c28a8a)) - -### Features - -- **cli:** Add support for JavaScript to the new CLI ([#2668](https://github.com/feathersjs/feathers/issues/2668)) ([ebac587](https://github.com/feathersjs/feathers/commit/ebac587f7d00dc7607c3f546352d79f79b89a5d4)) - -# [5.0.0-pre.23](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.22...v5.0.0-pre.23) (2022-06-06) - -### Bug Fixes - -- **express:** Ensure Express options can be set before configuring REST transport ([#2655](https://github.com/feathersjs/feathers/issues/2655)) ([c9b8f74](https://github.com/feathersjs/feathers/commit/c9b8f74a0196acb99be44ac5e0fff3f1128288cd)) - -# [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/express - -# [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/express - -# [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) - -### Bug Fixes - -- **express:** Fix typo in types reference in package.json ([#2613](https://github.com/feathersjs/feathers/issues/2613)) ([eacf1b3](https://github.com/feathersjs/feathers/commit/eacf1b3474e6d9da69b8671244c23a75cff87d95)) - -### Features - -- **typescript:** Improve params and query typeability ([#2600](https://github.com/feathersjs/feathers/issues/2600)) ([df28b76](https://github.com/feathersjs/feathers/commit/df28b7619161f1df5e700326f52cca1a92dc5d28)) - -# [5.0.0-pre.18](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.17...v5.0.0-pre.18) (2022-04-11) - -### Features - -- **core:** Add app.teardown functionality ([#2570](https://github.com/feathersjs/feathers/issues/2570)) ([fcdf524](https://github.com/feathersjs/feathers/commit/fcdf524ae1995bb59265d39f12e98b7794bed023)) -- **core:** Finalize app.teardown() functionality ([#2584](https://github.com/feathersjs/feathers/issues/2584)) ([1a166f3](https://github.com/feathersjs/feathers/commit/1a166f3ded811ecacf0ae8cb67880bc9fa2eeafa)) -- **transport-commons:** add `context.http.response` ([#2524](https://github.com/feathersjs/feathers/issues/2524)) ([5bc9d44](https://github.com/feathersjs/feathers/commit/5bc9d447043c2e2b742c73ed28ecf3b3264dd9e5)) - -# [5.0.0-pre.17](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.16...v5.0.0-pre.17) (2022-02-15) - -### Bug Fixes - -- **express:** Fix application typings to work with typed configuration ([#2539](https://github.com/feathersjs/feathers/issues/2539)) ([b9dfaee](https://github.com/feathersjs/feathers/commit/b9dfaee834b13864c1ed4f2f6a244eb5bb70395b)) - -# [5.0.0-pre.16](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.15...v5.0.0-pre.16) (2022-01-12) - -### Features - -- **express, koa:** make transports similar ([#2486](https://github.com/feathersjs/feathers/issues/2486)) ([26aa937](https://github.com/feathersjs/feathers/commit/26aa937c114fb8596dfefc599b1f53cead69c159)) - -# [5.0.0-pre.15](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.14...v5.0.0-pre.15) (2021-11-27) - -### Bug Fixes - -- missing express types for Request, Response ([#2498](https://github.com/feathersjs/feathers/issues/2498)) ([ee67131](https://github.com/feathersjs/feathers/commit/ee67131bbaa24c54d3d781bdf8820015759ac488)) -- **typescript:** Overall typing improvements ([#2478](https://github.com/feathersjs/feathers/issues/2478)) ([b8eb804](https://github.com/feathersjs/feathers/commit/b8eb804158556d9651a8607e3c3fda15e0bfd110)) - -### Features - -- **core:** add `context.http` and move `statusCode` there ([#2496](https://github.com/feathersjs/feathers/issues/2496)) ([b701bf7](https://github.com/feathersjs/feathers/commit/b701bf77fb83048aa1dffa492b3d77dd53f7b72b)) -- **core:** Improve legacy hooks integration ([08c8b40](https://github.com/feathersjs/feathers/commit/08c8b40999bf3889c61a4d4fad97a2c4f78bafc9)) - -# [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/express - -# [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/express - -# [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/express - -# [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/express - -# [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/express - -# [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/express - -# [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/express - -# [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/express - -# [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/express - -# [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/express - -# [5.0.0-pre.4](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.3...v5.0.0-pre.4) (2021-05-13) - -### Features - -- **koa:** KoaJS transport adapter ([#2315](https://github.com/feathersjs/feathers/issues/2315)) ([2554b57](https://github.com/feathersjs/feathers/commit/2554b57cf05731df58feeba9c12faab18e442107)) - -# [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)) - -### Features - -- **dependencies:** Remove direct debug dependency ([#2296](https://github.com/feathersjs/feathers/issues/2296)) ([501d416](https://github.com/feathersjs/feathers/commit/501d4164d30c6a126906dc640cdfdc82207ba34a)) - -# [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/express - -# [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/express - -# [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 - -- Resolve some type problems ([#2260](https://github.com/feathersjs/feathers/issues/2260)) ([a3d75fa](https://github.com/feathersjs/feathers/commit/a3d75fa29490e8a19412a12bc993ee7bb573068f)) -- Update Grant usage and other dependencies ([#2264](https://github.com/feathersjs/feathers/issues/2264)) ([7b0f8fa](https://github.com/feathersjs/feathers/commit/7b0f8fad252419ed0ad0bf259cdf3104d322ab60)) - -### Features - -- **core:** Public custom service methods ([#2270](https://github.com/feathersjs/feathers/issues/2270)) ([e65abfb](https://github.com/feathersjs/feathers/commit/e65abfb5388df6c19a11c565cf1076a29f32668d)) -- Application service types default to any ([#1566](https://github.com/feathersjs/feathers/issues/1566)) ([d93ba9a](https://github.com/feathersjs/feathers/commit/d93ba9a17edd20d3397bb00f4f6e82e804e42ed6)) -- Feathers v5 core refactoring and features ([#2255](https://github.com/feathersjs/feathers/issues/2255)) ([2dafb7c](https://github.com/feathersjs/feathers/commit/2dafb7ce14ba57406aeec13d10ca45b1e709bee9)) -- **core:** Remove Uberproto ([#2178](https://github.com/feathersjs/feathers/issues/2178)) ([ddf8821](https://github.com/feathersjs/feathers/commit/ddf8821f53317e6a378657f7d66acb03a037ee47)) - -### BREAKING CHANGES - -- **core:** Services no longer extend Uberproto objects and - `service.mixin()` is no longer available. - -# [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) - -### Features - -- **core:** use @feathers/hooks and add async type ([#1929](https://github.com/feathersjs/feathers/issues/1929)) ([a5c4756](https://github.com/feathersjs/feathers/commit/a5c47562eae8410c82fe2f6308f26f8e78b6a3e8)) - -# [5.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v4.5.4...v5.0.0-pre.0) (2020-05-19) - -### Features - -- **core:** use @feathers/hooks and add async type ([#1929](https://github.com/feathersjs/feathers/issues/1929)) ([a5c4756](https://github.com/feathersjs/feathers/commit/a5c47562eae8410c82fe2f6308f26f8e78b6a3e8)) - -## [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/express - -## [4.5.10](https://github.com/feathersjs/feathers/compare/v4.5.9...v4.5.10) (2020-11-08) - -### Bug Fixes - -- **authentication:** consistent response return between local and jwt strategy ([#2042](https://github.com/feathersjs/feathers/issues/2042)) ([8d25be1](https://github.com/feathersjs/feathers/commit/8d25be101a2593a9e789375c928a07780b9e28cf)) - -## [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/express - -## [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/express - -## [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/express - -## [4.5.6](https://github.com/feathersjs/feathers/compare/v4.5.5...v4.5.6) (2020-07-12) - -**Note:** Version bump only for package @feathersjs/express - -## [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/express - -## [4.5.4](https://github.com/feathersjs/feathers/compare/v4.5.3...v4.5.4) (2020-04-29) - -**Note:** Version bump only for package @feathersjs/express - -## [4.5.3](https://github.com/feathersjs/feathers/compare/v4.5.2...v4.5.3) (2020-04-17) - -**Note:** Version bump only for package @feathersjs/express - -## [4.5.2](https://github.com/feathersjs/feathers/compare/v4.5.1...v4.5.2) (2020-03-04) - -### Bug Fixes - -- Updated typings for express middleware ([#1839](https://github.com/feathersjs/feathers/issues/1839)) ([6b8e897](https://github.com/feathersjs/feathers/commit/6b8e8971a9dbb08913edd1be48826624645d9dc1)) - -## [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/express - -# [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/express - -## [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/express - -## [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/express - -# [4.4.0](https://github.com/feathersjs/feathers/compare/v4.3.11...v4.4.0) (2019-11-27) - -### Features - -- **authentication:** Add parseStrategies to allow separate strategies for creating JWTs and parsing headers ([#1708](https://github.com/feathersjs/feathers/issues/1708)) ([5e65629](https://github.com/feathersjs/feathers/commit/5e65629b924724c3e81d7c81df047e123d1c8bd7)) - -## [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/express - -## [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/express - -## [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) - -### Bug Fixes - -- Typings for express request and response properties ([#1609](https://github.com/feathersjs/feathers/issues/1609)) ([38cf8c9](https://github.com/feathersjs/feathers/commit/38cf8c950c1a4fb4a6d78d68d70e7fdd63b71c3c)) - -## [4.3.5](https://github.com/feathersjs/feathers/compare/v4.3.4...v4.3.5) (2019-10-07) - -**Note:** Version bump only for package @feathersjs/express - -## [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/express - -## [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/express - -## [4.3.2](https://github.com/feathersjs/feathers/compare/v4.3.1...v4.3.2) (2019-09-16) - -### Bug Fixes - -- Add info to express error handler logger type ([#1557](https://github.com/feathersjs/feathers/issues/1557)) ([3e1d26c](https://github.com/feathersjs/feathers/commit/3e1d26c)) - -## [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/express - -# [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/express - -# [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/express - -# [4.3.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.2...v4.3.0-pre.3) (2019-08-19) - -### Bug Fixes - -- Update all dependencies ([7d53a00](https://github.com/feathersjs/feathers/commit/7d53a00)) - -# [4.3.0-pre.2](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.1...v4.3.0-pre.2) (2019-08-02) - -### Bug Fixes - -- Add method to reliably get default authentication service ([#1470](https://github.com/feathersjs/feathers/issues/1470)) ([e542cb3](https://github.com/feathersjs/feathers/commit/e542cb3)) - -# [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/express - -# [4.0.0-pre.5](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.4...v4.0.0-pre.5) (2019-07-10) - -### Bug Fixes - -- Remove unnecessary top level export files in @feathersjs/express ([#1442](https://github.com/feathersjs/feathers/issues/1442)) ([73c3fb2](https://github.com/feathersjs/feathers/commit/73c3fb2)) - -### Features - -- @feathersjs/express allow to pass an existing Express application instance ([#1446](https://github.com/feathersjs/feathers/issues/1446)) ([853a6b0](https://github.com/feathersjs/feathers/commit/853a6b0)) - -# [4.0.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.3...v4.0.0-pre.4) (2019-07-05) - -### Bug Fixes - -- @feathersjs/express: allow middleware arrays ([#1421](https://github.com/feathersjs/feathers/issues/1421)) ([b605ab8](https://github.com/feathersjs/feathers/commit/b605ab8)) -- @feathersjs/express: replace `reduce` with `map` ([#1429](https://github.com/feathersjs/feathers/issues/1429)) ([44542e9](https://github.com/feathersjs/feathers/commit/44542e9)) -- Clean up hooks code ([#1407](https://github.com/feathersjs/feathers/issues/1407)) ([f25c88b](https://github.com/feathersjs/feathers/commit/f25c88b)) - -# [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 - -- Always require strategy parameter in authentication ([#1327](https://github.com/feathersjs/feathers/issues/1327)) ([d4a8021](https://github.com/feathersjs/feathers/commit/d4a8021)) -- Merge httpStrategies and authStrategies option ([#1308](https://github.com/feathersjs/feathers/issues/1308)) ([afa4d55](https://github.com/feathersjs/feathers/commit/afa4d55)) - -### Features - -- Add params.headers to all transports when available ([#1303](https://github.com/feathersjs/feathers/issues/1303)) ([ebce79b](https://github.com/feathersjs/feathers/commit/ebce79b)) -- express use service.methods ([#945](https://github.com/feathersjs/feathers/issues/945)) ([3f0b1c3](https://github.com/feathersjs/feathers/commit/3f0b1c3)) - -# [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 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)) -- **chore:** Properly configure and run code linter ([#1092](https://github.com/feathersjs/feathers/issues/1092)) ([fd3fc34](https://github.com/feathersjs/feathers/commit/fd3fc34)) -- **package:** update @feathersjs/commons to version 2.0.0 ([#31](https://github.com/feathersjs/feathers/issues/31)) ([c1ef5b1](https://github.com/feathersjs/feathers/commit/c1ef5b1)) -- **package:** update debug to version 3.0.0 ([#2](https://github.com/feathersjs/feathers/issues/2)) ([7e19603](https://github.com/feathersjs/feathers/commit/7e19603)) - -### Features - -- @feathersjs/authentication-oauth ([#1299](https://github.com/feathersjs/feathers/issues/1299)) ([656bae7](https://github.com/feathersjs/feathers/commit/656bae7)) -- Add AuthenticationBaseStrategy and make authentication option handling more explicit ([#1284](https://github.com/feathersjs/feathers/issues/1284)) ([2667d92](https://github.com/feathersjs/feathers/commit/2667d92)) -- Add TypeScript definitions ([#1275](https://github.com/feathersjs/feathers/issues/1275)) ([9dd6713](https://github.com/feathersjs/feathers/commit/9dd6713)) -- Allow registering a service at the root level ([#1115](https://github.com/feathersjs/feathers/issues/1115)) ([c73d322](https://github.com/feathersjs/feathers/commit/c73d322)) -- Authentication v3 client ([#1240](https://github.com/feathersjs/feathers/issues/1240)) ([65b43bd](https://github.com/feathersjs/feathers/commit/65b43bd)) -- Authentication v3 Express integration ([#1218](https://github.com/feathersjs/feathers/issues/1218)) ([82bcfbe](https://github.com/feathersjs/feathers/commit/82bcfbe)) - -### BREAKING CHANGES - -- Rewrite for authentication v3 - -## [1.3.1](https://github.com/feathersjs/feathers/compare/@feathersjs/express@1.3.0...@feathersjs/express@1.3.1) (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)) - - - -# [1.3.0](https://github.com/feathersjs/feathers/compare/@feathersjs/express@1.2.7...@feathersjs/express@1.3.0) (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)) -- **chore:** Properly configure and run code linter ([#1092](https://github.com/feathersjs/feathers/issues/1092)) ([fd3fc34](https://github.com/feathersjs/feathers/commit/fd3fc34)) - -### Features - -- Allow registering a service at the root level ([#1115](https://github.com/feathersjs/feathers/issues/1115)) ([c73d322](https://github.com/feathersjs/feathers/commit/c73d322)) - - - -## [1.2.7](https://github.com/feathersjs/feathers/compare/@feathersjs/express@1.2.6...@feathersjs/express@1.2.7) (2018-09-21) - -**Note:** Version bump only for package @feathersjs/express - - - -## [1.2.6](https://github.com/feathersjs/feathers/compare/@feathersjs/express@1.2.5...@feathersjs/express@1.2.6) (2018-09-17) - -**Note:** Version bump only for package @feathersjs/express - - - -## [1.2.5](https://github.com/feathersjs/feathers/compare/@feathersjs/express@1.2.4...@feathersjs/express@1.2.5) (2018-09-02) - -**Note:** Version bump only for package @feathersjs/express - - - -## 1.2.4 - -- Migrate to Monorepo ([feathers#462](https://github.com/feathersjs/feathers/issues/462)) - -## [v1.2.3](https://github.com/feathersjs/express/tree/v1.2.3) (2018-06-03) - -[Full Changelog](https://github.com/feathersjs/express/compare/v1.2.2...v1.2.3) - -**Closed issues:** - -- Question: How to handle JSON:API [\#26](https://github.com/feathersjs/express/issues/26) -- \[Proposal\] Allow multiple express middleware functions to be passed into `app.use` [\#24](https://github.com/feathersjs/express/issues/24) - -**Merged pull requests:** - -- Update uberproto to the latest version [\#28](https://github.com/feathersjs/express/pull/28) ([bertho-zero](https://github.com/bertho-zero)) - -## [v1.2.2](https://github.com/feathersjs/express/tree/v1.2.2) (2018-04-16) - -[Full Changelog](https://github.com/feathersjs/express/compare/v1.2.1...v1.2.2) - -**Merged pull requests:** - -- Allow multiple express middleware functions to be passed into `app.use` [\#25](https://github.com/feathersjs/express/pull/25) ([eXigentCoder](https://github.com/eXigentCoder)) - -## [v1.2.1](https://github.com/feathersjs/express/tree/v1.2.1) (2018-03-29) - -[Full Changelog](https://github.com/feathersjs/express/compare/v1.2.0...v1.2.1) - -**Closed issues:** - -- Error in error hook results in unhandled rejection [\#21](https://github.com/feathersjs/express/issues/21) -- Error handler in wrapper hides breaks and hides real error [\#13](https://github.com/feathersjs/express/issues/13) - -**Merged pull requests:** - -- Allow to set HTTP status code in a hook [\#23](https://github.com/feathersjs/express/pull/23) ([daffl](https://github.com/daffl)) -- Update axios to the latest version 🚀 [\#22](https://github.com/feathersjs/express/pull/22) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v1.2.0](https://github.com/feathersjs/express/tree/v1.2.0) (2018-02-09) - -[Full Changelog](https://github.com/feathersjs/express/compare/v1.1.2...v1.2.0) - -**Closed issues:** - -- Error in `create` method results in unhandled rejection [\#19](https://github.com/feathersjs/express/issues/19) -- @feathersjs/express call without paramaters could returns an instance of express [\#18](https://github.com/feathersjs/express/issues/18) -- Feathers-express blows up the feathers application version property and the example doesn't work [\#16](https://github.com/feathersjs/express/issues/16) - -**Merged pull requests:** - -- Return an instance of the original Express application when nothing i… [\#20](https://github.com/feathersjs/express/pull/20) ([daffl](https://github.com/daffl)) -- Fix README example [\#17](https://github.com/feathersjs/express/pull/17) ([bertho-zero](https://github.com/bertho-zero)) -- Update mocha to the latest version 🚀 [\#15](https://github.com/feathersjs/express/pull/15) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update semistandard to the latest version 🚀 [\#14](https://github.com/feathersjs/express/pull/14) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v1.1.2](https://github.com/feathersjs/express/tree/v1.1.2) (2017-11-16) - -[Full Changelog](https://github.com/feathersjs/express/compare/v1.1.1...v1.1.2) - -**Merged pull requests:** - -- Export default and original Express object [\#12](https://github.com/feathersjs/express/pull/12) ([daffl](https://github.com/daffl)) - -## [v1.1.1](https://github.com/feathersjs/express/tree/v1.1.1) (2017-11-06) - -[Full Changelog](https://github.com/feathersjs/express/compare/v1.1.0...v1.1.1) - -**Merged pull requests:** - -- Also add notFound to export [\#11](https://github.com/feathersjs/express/pull/11) ([daffl](https://github.com/daffl)) - -## [v1.1.0](https://github.com/feathersjs/express/tree/v1.1.0) (2017-11-05) - -[Full Changelog](https://github.com/feathersjs/express/compare/v1.0.0...v1.1.0) - -**Merged pull requests:** - -- Re-export Express error handler [\#10](https://github.com/feathersjs/express/pull/10) ([daffl](https://github.com/daffl)) - -## [v1.0.0](https://github.com/feathersjs/express/tree/v1.0.0) (2017-11-01) - -[Full Changelog](https://github.com/feathersjs/express/compare/v1.0.0-pre.4...v1.0.0) - -## [v1.0.0-pre.4](https://github.com/feathersjs/express/tree/v1.0.0-pre.4) (2017-10-25) - -[Full Changelog](https://github.com/feathersjs/express/compare/v1.0.0-pre.3...v1.0.0-pre.4) - -**Merged pull requests:** - -- Update to better returnHook handling [\#9](https://github.com/feathersjs/express/pull/9) ([daffl](https://github.com/daffl)) - -## [v1.0.0-pre.3](https://github.com/feathersjs/express/tree/v1.0.0-pre.3) (2017-10-21) - -[Full Changelog](https://github.com/feathersjs/express/compare/v1.0.0-pre.2...v1.0.0-pre.3) - -**Merged pull requests:** - -- Add REST provider to Express framework bindings [\#8](https://github.com/feathersjs/express/pull/8) ([daffl](https://github.com/daffl)) -- Update repository name and move to npm scope [\#7](https://github.com/feathersjs/express/pull/7) ([daffl](https://github.com/daffl)) -- Update axios to the latest version 🚀 [\#6](https://github.com/feathersjs/express/pull/6) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v1.0.0-pre.2](https://github.com/feathersjs/express/tree/v1.0.0-pre.2) (2017-10-18) - -[Full Changelog](https://github.com/feathersjs/express/compare/v1.0.0-pre.1...v1.0.0-pre.2) - -**Merged pull requests:** - -- Also export Express top level functionality [\#5](https://github.com/feathersjs/express/pull/5) ([daffl](https://github.com/daffl)) -- Update mocha to the latest version 🚀 [\#4](https://github.com/feathersjs/express/pull/4) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update debug to the latest version 🚀 [\#2](https://github.com/feathersjs/express/pull/2) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v1.0.0-pre.1](https://github.com/feathersjs/express/tree/v1.0.0-pre.1) (2017-07-19) - -**Merged pull requests:** - -- Update dependencies to enable Greenkeeper 🌴 [\#1](https://github.com/feathersjs/express/pull/1) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -\* _This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)_ diff --git a/packages/express/LICENSE b/packages/express/LICENSE deleted file mode 100644 index 7839c824d7..0000000000 --- a/packages/express/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2024 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 -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -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/express/README.md b/packages/express/README.md deleted file mode 100644 index 9c6a221843..0000000000 --- a/packages/express/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# @feathersjs/express - -[![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/express.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/express) -[![Discord](https://badgen.net/badge/icon/discord?icon=discord&label)](https://discord.gg/qa8kez8QBx) - -> Feathers Express framework bindings and REST provider - -## Installation - -``` -npm install @feathersjs/client --save -``` - -## Documentation - -Refer to the [Feathers Express API documentation](https://feathersjs.com/api/express.html) 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/express/package.json b/packages/express/package.json deleted file mode 100644 index 656e9119fe..0000000000 --- a/packages/express/package.json +++ /dev/null @@ -1,82 +0,0 @@ -{ - "name": "@feathersjs/express", - "description": "Feathers Express framework bindings and REST provider", - "version": "5.0.34", - "homepage": "https://feathersjs.com", - "main": "lib/", - "types": "lib/", - "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", - "directory": "packages/express" - }, - "author": { - "name": "Feathers contributors", - "email": "hello@feathersjs.com", - "url": "https://feathersjs.com" - }, - "contributors": [], - "bugs": { - "url": "https://github.com/feathersjs/feathers/issues" - }, - "engines": { - "node": ">= 12" - }, - "files": [ - "CHANGELOG.md", - "LICENSE", - "README.md", - "src/**", - "lib/**", - "public/**" - ], - "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" - }, - "directories": { - "lib": "lib" - }, - "publishConfig": { - "access": "public" - }, - "dependencies": { - "@feathersjs/authentication": "^5.0.34", - "@feathersjs/commons": "^5.0.34", - "@feathersjs/errors": "^5.0.34", - "@feathersjs/feathers": "^5.0.34", - "@feathersjs/transport-commons": "^5.0.34", - "@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" - }, - "devDependencies": { - "@feathersjs/authentication-local": "^5.0.34", - "@feathersjs/tests": "^5.0.34", - "@types/lodash": "^4.17.20", - "@types/mocha": "^10.0.10", - "@types/node": "^24.1.0", - "axios": "^1.11.0", - "lodash": "^4.17.21", - "mocha": "^11.7.1", - "shx": "^0.4.0", - "ts-node": "^10.9.2", - "typescript": "^5.9.2" - }, - "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" -} diff --git a/packages/express/public/401.html b/packages/express/public/401.html deleted file mode 100644 index aee84d738a..0000000000 --- a/packages/express/public/401.html +++ /dev/null @@ -1,67 +0,0 @@ - - - Not Authorized - - - -
-

401

-

Not Authorized

- -
-

Powered by

-
-
- - diff --git a/packages/express/public/404.html b/packages/express/public/404.html deleted file mode 100644 index c781afec05..0000000000 --- a/packages/express/public/404.html +++ /dev/null @@ -1,66 +0,0 @@ - - - Page Not Found - - - -
-

404

-

Page Not Found

-
-

Powered by

-
-
- - diff --git a/packages/express/public/default.html b/packages/express/public/default.html deleted file mode 100644 index 175122a006..0000000000 --- a/packages/express/public/default.html +++ /dev/null @@ -1,66 +0,0 @@ - - - Internal Server Error - - - -
-

Oh no!

-

Something went wrong

-
-

Powered by

-
-
- - diff --git a/packages/express/src/authentication.ts b/packages/express/src/authentication.ts deleted file mode 100644 index 519e7e32e2..0000000000 --- a/packages/express/src/authentication.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { RequestHandler, Request, Response } from 'express' -import { HookContext } from '@feathersjs/feathers' -import { createDebug } from '@feathersjs/commons' -import { authenticate as AuthenticateHook } from '@feathersjs/authentication' - -import { Application } from './declarations' - -const debug = createDebug('@feathersjs/express/authentication') - -const toHandler = ( - func: (req: Request, res: Response, next: () => void) => Promise -): RequestHandler => { - return (req, res, next) => func(req, res, next).catch((error) => next(error)) -} - -export type AuthenticationSettings = { - service?: string - strategies?: string[] -} - -export function parseAuthentication(settings: AuthenticationSettings = {}): RequestHandler { - return toHandler(async (req, res, next) => { - const app = req.app as any as Application - const service = app.defaultAuthentication?.(settings.service) - - if (!service) { - return next() - } - - const config = service.configuration - const authStrategies = settings.strategies || config.parseStrategies || config.authStrategies || [] - - if (authStrategies.length === 0) { - debug('No `authStrategies` or `parseStrategies` found in authentication configuration') - return next() - } - - const authentication = await service.parse(req, res, ...authStrategies) - - if (authentication) { - debug('Parsed authentication from HTTP header', authentication) - req.feathers = { ...req.feathers, authentication } - } - - return next() - }) -} - -export function authenticate( - settings: string | AuthenticationSettings, - ...strategies: string[] -): RequestHandler { - const hook = AuthenticateHook(settings, ...strategies) - - return toHandler(async (req, _res, next) => { - const app = req.app as any as Application - const params = req.feathers - const context = { app, params } as any as HookContext - - await hook(context) - - req.feathers = context.params - - return next() - }) -} diff --git a/packages/express/src/declarations.ts b/packages/express/src/declarations.ts deleted file mode 100644 index d4f7a34afd..0000000000 --- a/packages/express/src/declarations.ts +++ /dev/null @@ -1,68 +0,0 @@ -import http from 'http' -import express, { Express } from 'express' -import { - Application as FeathersApplication, - Params as FeathersParams, - HookContext, - ServiceMethods, - ServiceInterface, - RouteLookup -} from '@feathersjs/feathers' - -interface ExpressUseHandler { - ( - path: L, - ...middlewareOrService: ( - | Express - | express.RequestHandler - | express.RequestHandler[] - | (keyof any extends keyof Services ? ServiceInterface : Services[L]) - )[] - ): T - (path: string | RegExp, ...expressHandlers: express.RequestHandler[]): T - (...expressHandlers: express.RequestHandler[]): T - (handler: Express | express.ErrorRequestHandler): T -} - -export interface ExpressOverrides { - listen(port: number, hostname: string, backlog: number, callback?: () => void): Promise - listen(port: number, hostname: string, callback?: () => void): Promise - listen(port: number | string | any, callback?: () => void): Promise - listen(callback?: () => void): Promise - use: ExpressUseHandler - server?: http.Server -} - -export type Application = Omit & - FeathersApplication & - ExpressOverrides - -declare module '@feathersjs/feathers/lib/declarations' { - interface ServiceOptions { - express?: { - before?: express.RequestHandler[] - after?: express.RequestHandler[] - composed?: express.RequestHandler - } - } -} - -declare module 'express-serve-static-core' { - interface Request { - feathers: Partial & { [key: string]: any } - lookup?: RouteLookup - } - - interface Response { - data?: any - hook?: HookContext - } - - interface IRouterMatcher { - // eslint-disable-next-line -

( - path: PathParams, - ...handlers: (RequestHandler | Partial | Application)[] - ): T - } -} diff --git a/packages/express/src/handlers.ts b/packages/express/src/handlers.ts deleted file mode 100644 index 73c162759c..0000000000 --- a/packages/express/src/handlers.ts +++ /dev/null @@ -1,132 +0,0 @@ -import path from 'path' -import { NotFound, GeneralError } from '@feathersjs/errors' -import { Request, Response, NextFunction, ErrorRequestHandler, RequestHandler } from 'express' - -const defaults = { - public: path.resolve(__dirname, '..', 'public'), - logger: console -} -const defaultHtmlError = path.resolve(defaults.public, 'default.html') - -export function notFound({ verbose = false } = {}): RequestHandler { - return function (req: Request, _res: Response, next: NextFunction) { - const url = `${req.url}` - const message = `Page not found${verbose ? ': ' + url : ''}` - - next(new NotFound(message, { url })) - } -} - -export type ErrorHandlerOptions = { - public?: string - logger?: boolean | { error?: (msg: any) => void; info?: (msg: any) => void } - html?: any - json?: any -} - -export function errorHandler(_options: ErrorHandlerOptions = {}): ErrorRequestHandler { - const options = Object.assign({}, defaults, _options) - - if (typeof options.html === 'undefined') { - options.html = { - 401: path.resolve(options.public, '401.html'), - 404: path.resolve(options.public, '404.html'), - default: defaultHtmlError - } - } - - if (typeof options.json === 'undefined') { - options.json = {} - } - - return function (error: any, req: Request, res: Response, next: NextFunction) { - // Set the error code for HTTP processing semantics - error.code = !isNaN(parseInt(error.code, 10)) ? parseInt(error.code, 10) : 500 - - // Log the error if it didn't come from a service method call - if (options.logger && typeof options.logger.error === 'function' && !res.hook) { - if (error.code >= 500) { - options.logger.error(error) - } else { - options.logger.info(error) - } - } - - if (error.type !== 'FeathersError') { - const oldError = error - - error = oldError.errors - ? new GeneralError(oldError.message, { - errors: oldError.errors - }) - : new GeneralError(oldError.message) - - if (oldError.stack) { - error.stack = oldError.stack - } - } - - const formatter: { [key: string]: any } = {} - - // If the developer passed a custom function for ALL html errors - if (typeof options.html === 'function') { - formatter['text/html'] = options.html - } else { - let file = options.html[error.code] - if (!file) { - file = options.html.default || defaultHtmlError - } - // If the developer passed a custom function for individual html errors - if (typeof file === 'function') { - formatter['text/html'] = file - } else { - formatter['text/html'] = function () { - res.set('Content-Type', 'text/html') - res.sendFile(file) - } - } - } - - // If the developer passed a custom function for ALL json errors - if (typeof options.json === 'function') { - formatter['application/json'] = options.json - } else { - const handler = options.json[error.code] || options.json.default - // If the developer passed a custom function for individual json errors - if (typeof handler === 'function') { - formatter['application/json'] = handler - } else { - // Don't show stack trace if it is a 404 error - if (error.code === 404) { - error.stack = null - } - - formatter['application/json'] = function () { - const output = Object.assign({}, error.toJSON()) - - if (process.env.NODE_ENV === 'production') { - delete output.stack - } - - res.set('Content-Type', 'application/json') - res.json(output) - } - } - } - - res.status(error.code) - - const contentType = req.headers['content-type'] || '' - const accepts = req.headers.accept || '' - - // by default just send back json - if (contentType.indexOf('json') !== -1 || accepts.indexOf('json') !== -1) { - formatter['application/json'](error, req, res, next) - } else if (options.html && (contentType.indexOf('html') !== -1 || accepts.indexOf('html') !== -1)) { - formatter['text/html'](error, req, res, next) - } else { - // TODO (EK): Maybe just return plain text - formatter['application/json'](error, req, res, next) - } - } -} diff --git a/packages/express/src/index.ts b/packages/express/src/index.ts deleted file mode 100644 index 675ae253d3..0000000000 --- a/packages/express/src/index.ts +++ /dev/null @@ -1,166 +0,0 @@ -import express, { Express } from 'express' -import { Application as FeathersApplication, defaultServiceMethods } from '@feathersjs/feathers' -import { routing } from '@feathersjs/transport-commons' -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' - -export { - original, - serveStatic, - serveStatic as static, - json, - raw, - text, - urlencoded, - query, - rest, - Router, - RestOptions, - formatter, - errorHandler, - notFound, - Application, - ErrorHandlerOptions, - ExpressOverrides, - AuthenticationSettings, - parseAuthentication, - authenticate, - cors, - compression -} - -const debug = createDebug('@feathersjs/express') - -export default function feathersExpress( - feathersApp?: FeathersApplication, - expressApp: Express = express() -): Application { - if (!feathersApp) { - return expressApp as any - } - - if (typeof feathersApp.setup !== 'function') { - throw new Error('@feathersjs/express requires a valid Feathers application instance') - } - - const app = expressApp as any as Application - const { use: expressUse, listen: expressListen } = expressApp as any - const { use: feathersUse, teardown: feathersTeardown } = feathersApp - - Object.assign(app, { - use(location: string & keyof S, ...rest: any[]) { - let service: any - let options = {} - - const middleware = rest.reduce( - function (middleware, arg) { - if (typeof arg === 'function' || Array.isArray(arg)) { - middleware[service ? 'after' : 'before'].push(arg) - } else if (!service) { - service = arg - } else if (arg.methods || arg.events || arg.express || arg.koa) { - options = arg - } else { - throw new Error('Invalid options passed to app.use') - } - return middleware - }, - { - before: [], - after: [] - } - ) - - const hasMethod = (methods: string[]) => - methods.some((name) => service && typeof service[name] === 'function') - - // Check for service (any object with at least one service method) - if (hasMethod(['handle', 'set']) || !hasMethod(defaultServiceMethods)) { - debug('Passing app.use call to Express app') - return expressUse.call(this, location, ...rest) - } - - debug('Registering service with middleware', middleware) - // Since this is a service, call Feathers `.use` - feathersUse.call(this, location, service, { - express: middleware, - ...options - }) - - return this - }, - - async listen(...args: any[]) { - const server = expressListen.call(this, ...args) - - this.server = server - await this.setup(server) - debug('Feathers application listening') - - return server - } - } as Application) - - const appDescriptors = { - ...Object.getOwnPropertyDescriptors(Object.getPrototypeOf(app)), - ...Object.getOwnPropertyDescriptors(app) - } - const newDescriptors = { - ...Object.getOwnPropertyDescriptors(Object.getPrototypeOf(feathersApp)), - ...Object.getOwnPropertyDescriptors(feathersApp) - } - - // 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] - - if (appProp === undefined && newProp !== undefined) { - Object.defineProperty(expressApp, prop, newProp) - } - }) - - // Assign teardown and setup which will also make sure that hooks are initialized - app.setup = feathersApp.setup as any - app.teardown = async function teardown(server?: any) { - return feathersTeardown.call(this, server).then( - () => - new Promise((resolve, reject) => { - if (this.server) { - this.server.close((e) => (e ? reject(e) : resolve(this))) - } else { - resolve(this) - } - }) - ) - } - - app.configure(routing() as any) - app.use((req, _res, next) => { - req.feathers = { ...req.feathers, provider: 'rest' } - return next() - }) - - return app -} - -if (typeof module !== 'undefined') { - module.exports = Object.assign(feathersExpress, module.exports) -} diff --git a/packages/express/src/rest.ts b/packages/express/src/rest.ts deleted file mode 100644 index 6b4cc1c9d9..0000000000 --- a/packages/express/src/rest.ts +++ /dev/null @@ -1,113 +0,0 @@ -import { Request, Response, RequestHandler, Router } from 'express' -import { MethodNotAllowed } from '@feathersjs/errors' -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' - -const debug = createDebug('@feathersjs/express/rest') - -const toHandler = ( - func: (req: Request, res: Response, next: () => void) => Promise -): RequestHandler => { - return (req, res, next) => func(req, res, next).catch((error) => next(error)) -} - -const serviceMiddleware = (): RequestHandler => { - return toHandler(async (req, res, next) => { - const { query, headers, path, body: data, method: httpMethod } = req - const methodOverride = req.headers[http.METHOD_HEADER] as string | undefined - - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - const { service, params: { __id: id = null, ...route } = {} } = req.lookup! - const method = http.getServiceMethod(httpMethod, id, methodOverride) - const { methods } = getServiceOptions(service) - - debug(`Found service for path ${path}, attempting to run '${method}' service method`) - - if (!methods.includes(method) || defaultServiceMethods.includes(methodOverride)) { - const error = new MethodNotAllowed(`Method \`${method}\` is not supported by this endpoint.`) - res.statusCode = error.code - throw error - } - - const createArguments = http.argumentsFor[method as 'get'] || http.argumentsFor.default - const params = { query, headers, route, ...req.feathers } - const args = createArguments({ id, data, params }) - const contextBase = createContext(service, method, { http: {} }) - res.hook = contextBase - - const context = await (service as any)[method](...args, contextBase) - res.hook = context - - const response = http.getResponse(context) - res.statusCode = response.status - res.set(response.headers) - res.data = response.body - - return next() - }) -} - -const servicesMiddleware = (): RequestHandler => { - return toHandler(async (req, res, next) => { - const app = req.app as any as Application - const lookup = app.lookup(req.path) - - if (!lookup) { - return next() - } - - req.lookup = lookup - - const options = getServiceOptions(lookup.service) - const middleware = options.express.composed - - return middleware(req, res, next) - }) -} - -export const formatter: RequestHandler = (_req, res, next) => { - if (res.data === undefined) { - return next() - } - - res.format({ - 'application/json'() { - res.json(res.data) - } - }) -} - -export type RestOptions = { - formatter?: RequestHandler - authentication?: AuthenticationSettings -} - -export const rest = (options?: RestOptions | RequestHandler) => { - options = typeof options === 'function' ? { formatter: options } : options || {} - - const formatterMiddleware = options.formatter || formatter - const authenticationOptions = options.authentication - - return (app: Application) => { - if (typeof app.route !== 'function') { - throw new Error('@feathersjs/express/rest needs an Express compatible app.') - } - - app.use(parseAuthentication(authenticationOptions)) - app.use(servicesMiddleware()) - - app.mixins.push((_service, _path, options) => { - const { express: { before = [], after = [] } = {} } = options - - const middlewares = [].concat(before, serviceMiddleware(), after, formatterMiddleware) - const middleware = Router().use(middlewares) - - options.express ||= {} - options.express.composed = middleware - }) - } -} diff --git a/packages/express/test/authentication.test.ts b/packages/express/test/authentication.test.ts deleted file mode 100644 index a821c1517a..0000000000 --- a/packages/express/test/authentication.test.ts +++ /dev/null @@ -1,210 +0,0 @@ -/* eslint-disable @typescript-eslint/ban-ts-comment */ -import omit from 'lodash/omit' -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' - -const expressify = express.default -const axios = _axios.create({ - baseURL: 'http://localhost:9876/' -}) - -describe('@feathersjs/express/authentication', () => { - const email = 'expresstest@authentication.com' - const password = 'superexpress' - - let app: express.Application - let user: any - let authResult: AuthenticationResult - - before(async () => { - const expressApp = expressify(feathers()).use(express.json()).configure(express.rest()) - - app = createApplication(expressApp as any) as unknown as express.Application - - await app.listen(9876) - - app.use('/dummy', { - get(id, params) { - return Promise.resolve({ id, params }) - } - }) - - // @ts-ignore - app.use('/protected', express.authenticate('jwt'), (req, res) => { - res.json(req.feathers.user) - }) - - app.use( - express.errorHandler({ - logger: false - }) - ) - - app.service('dummy').hooks({ - before: [authenticate('jwt')] - }) - - const result = await app.service('users').create({ email, password }) - - user = result - - const res = await axios.post('/authentication', { - strategy: 'local', - password, - email - }) - - authResult = res.data - }) - - after(() => app.teardown()) - - describe('service authentication', () => { - it('successful local authentication', () => { - assert.ok(authResult.accessToken) - assert.deepStrictEqual(omit(authResult.authentication, 'payload'), { - strategy: 'local' - }) - assert.strictEqual(authResult.user.email, email) - assert.strictEqual(authResult.user.password, undefined) - }) - - it('local authentication with wrong password fails', async () => { - try { - await axios.post('/authentication', { - strategy: 'local', - password: 'wrong', - email - }) - assert.fail('Should never get here') - } catch (error: any) { - const { data } = error.response - assert.strictEqual(data.name, 'NotAuthenticated') - assert.strictEqual(data.message, 'Invalid login') - } - }) - - it('authenticating with JWT works but returns same accessToken', async () => { - const { accessToken } = authResult - const { data } = await axios.post('/authentication', { - strategy: 'jwt', - accessToken - }) - - assert.strictEqual(data.accessToken, accessToken) - assert.strictEqual(data.authentication.strategy, 'jwt') - assert.strictEqual(data.authentication.payload.sub, user.id.toString()) - assert.strictEqual(data.user.email, email) - }) - - it('can make a protected request with Authorization header', async () => { - const { accessToken } = authResult - - const { - data, - data: { params } - } = await axios.get('/dummy/dave', { - headers: { - Authorization: accessToken - } - }) - - assert.strictEqual(data.id, 'dave') - assert.deepStrictEqual(params.user, user) - assert.strictEqual(params.authentication.accessToken, accessToken) - }) - - it('errors when there are no authStrategies and parseStrategies', async () => { - const { accessToken } = authResult - app.get('authentication').authStrategies = [] - delete app.get('authentication').parseStrategies - - try { - await axios.get('/dummy/dave', { - headers: { - Authorization: accessToken - } - }) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.response.data.name, 'NotAuthenticated') - app.get('authentication').authStrategies = ['jwt', 'local'] - } - }) - - it('can make a protected request with Authorization header and bearer scheme', async () => { - const { accessToken } = authResult - - const { - data, - data: { params } - } = await axios.get('/dummy/dave', { - headers: { - Authorization: ` Bearer: ${accessToken}` - } - }) - - assert.strictEqual(data.id, 'dave') - assert.deepStrictEqual(params.user, user) - assert.strictEqual(params.authentication.accessToken, accessToken) - }) - }) - - describe('authenticate middleware', () => { - it('errors without valid strategies', () => { - try { - // @ts-ignore - authenticate() - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.message, 'The authenticate hook needs at least one allowed strategy') - } - }) - - it('protected endpoint fails when JWT is not present', () => { - return axios - .get('/protected') - .then(() => { - assert.fail('Should never get here') - }) - .catch((error) => { - const { data } = error.response - - assert.strictEqual(data.name, 'NotAuthenticated') - assert.strictEqual(data.message, 'Not authenticated') - }) - }) - - it.skip('protected endpoint fails with invalid Authorization header', async () => { - try { - await axios.get('/protected', { - headers: { - Authorization: 'Bearer: something wrong' - } - }) - assert.fail('Should never get here') - } catch (error: any) { - const { data } = error.response - - assert.strictEqual(data.name, 'NotAuthenticated') - assert.strictEqual(data.message, 'Not authenticated') - } - }) - - it('can request protected endpoint with JWT present', async () => { - const { data } = await axios.get('/protected', { - headers: { - Authorization: `Bearer ${authResult.accessToken}` - } - }) - - assert.strictEqual(data.email, user.email) - assert.strictEqual(data.id, user.id) - assert.strictEqual(data.password, user.password) - }) - }) -}) diff --git a/packages/express/test/error-handler.test.ts b/packages/express/test/error-handler.test.ts deleted file mode 100644 index e12b653d88..0000000000 --- a/packages/express/test/error-handler.test.ts +++ /dev/null @@ -1,399 +0,0 @@ -/* 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 axios from 'axios' -import fs from 'fs' -import { join } from 'path' -import { BadRequest, NotAcceptable, NotAuthenticated, NotFound, PaymentError } from '@feathersjs/errors' - -import { errorHandler } from '../src' - -const content = 'Error' - -const htmlHandler = function (_error: Error, _req: Request, res: Response, _next: NextFunction) { - res.send(content) -} - -const jsonHandler = function (error: Error, _req: Request, res: Response, _next: NextFunction) { - res.json(error) -} - -describe('error-handler', () => { - describe('supports catch-all custom handlers', function () { - before(function () { - this.app = express() - .get('/error', function (_req: Request, _res: Response, next: NextFunction) { - next(new Error('Something went wrong')) - }) - .use( - errorHandler({ - html: htmlHandler, - json: jsonHandler - }) - ) - - this.server = this.app.listen(5050) - }) - - after(function (done) { - this.server.close(done) - }) - - describe('JSON handler', () => { - const options = { - url: 'http://localhost:5050/error', - headers: { - 'Content-Type': 'application/json', - Accept: 'application/json' - } - } - - it('can send a custom response', async () => { - try { - await axios(options) - assert.fail('Should never get here') - } catch (error: any) { - assert.deepEqual(error.response.data, { - name: 'GeneralError', - message: 'Something went wrong', - code: 500, - className: 'general-error' - }) - } - }) - }) - }) - - describe('supports error-code specific custom handlers', () => { - describe('HTML handler', () => { - const req = { - headers: { 'content-type': 'text/html' } - } - const makeRes = (errCode: number, props?: any) => { - return Object.assign( - { - set() {}, - status(code: number) { - assert.equal(code, errCode) - } - }, - props - ) - } - - it('if the value is a string, calls res.sendFile', (done) => { - const err = new NotAuthenticated() - const middleware = errorHandler({ - logger: null, - html: { 401: 'path/to/401.html' } - }) - const res = makeRes(401, { - sendFile(f: any) { - assert.equal(f, 'path/to/401.html') - done() - } - }) - ;(middleware as any)(err, req, res) - }) - - it('if the value is a function, calls as middleware ', (done) => { - const err = new PaymentError() - const res = makeRes(402) - const middleware = errorHandler({ - logger: null, - html: { - 402: (_err: any, _req: any, _res: any) => { - assert.equal(_err, err) - assert.equal(_req, req) - assert.equal(_res, res) - done() - } - } - }) - ;(middleware as any)(err, req, res) - }) - - it('falls back to default if error code config is available', (done) => { - const err = new NotAcceptable() - const res = makeRes(406) - const middleware = errorHandler({ - logger: null, - html: { - default: (_err: any, _req: any, _res: any) => { - assert.equal(_err, err) - assert.equal(_req, req) - assert.equal(_res, res) - done() - } - } - }) - ;(middleware as any)(err, req, res) - }) - }) - - describe('JSON handler', () => { - const req = { - headers: { 'content-type': 'application/json' } - } - const makeRes = (errCode: number, props?: any) => { - return Object.assign( - { - set() {}, - status(code: number) { - assert.equal(code, errCode) - } - }, - props - ) - } - - it('calls res.json by default', (done) => { - const err = new NotAuthenticated() - const middleware = errorHandler({ - logger: null, - json: {} - }) - const res = makeRes(401, { - json(obj: any) { - assert.deepEqual(obj, err.toJSON()) - done() - } - }) - ;(middleware as any)(err, req, res) - }) - - it('if the value is a function, calls as middleware ', (done) => { - const err = new PaymentError() - const res = makeRes(402) - const middleware = errorHandler({ - logger: null, - json: { - 402: (_err: any, _req: any, _res: any) => { - assert.equal(_err, err) - assert.equal(_req, req) - assert.equal(_res, res) - done() - } - } - }) - ;(middleware as any)(err, req, res) - }) - - it('falls back to default if error code config is available', (done) => { - const err = new NotAcceptable() - const res = makeRes(406) - const middleware = errorHandler({ - logger: null, - json: { - default: (_err: any, _req: any, _res: any) => { - assert.equal(_err, err) - assert.equal(_req, req) - assert.equal(_res, res) - done() - } - } - }) - ;(middleware as any)(err, req, res) - }) - }) - }) - - describe('use as app error handler', function () { - before(function () { - this.app = express() - .get('/error', function (_req: Request, _res: Response, next: NextFunction) { - next(new Error('Something went wrong')) - }) - .get('/string-error', function (_req: Request, _res: Response, next: NextFunction) { - const e: any = new Error('Something was not found') - e.code = '404' - - next(e) - }) - .get('/bad-request', function (_req: Request, _res: Response, next: NextFunction) { - next( - new BadRequest({ - message: 'Invalid Password', - errors: [ - { - path: 'password', - value: null, - message: "'password' cannot be 'null'" - } - ] - }) - ) - }) - .use(function (_req: Request, _res: Response, next: NextFunction) { - next(new NotFound('File not found')) - }) - .use( - errorHandler({ - logger: null - }) - ) - - this.server = this.app.listen(5050) - }) - - after(function (done) { - this.server.close(done) - }) - - describe('converts an non-feathers error', () => { - it('is an instance of GeneralError', async () => { - try { - await axios({ - url: 'http://localhost:5050/error', - responseType: 'json' - }) - assert.fail('Should never get here') - } catch (error: any) { - assert.equal(error.response.status, 500) - assert.deepEqual(error.response.data, { - name: 'GeneralError', - message: 'Something went wrong', - code: 500, - className: 'general-error' - }) - } - }) - }) - - describe('text/html format', () => { - it('serves a 404.html', (done) => { - fs.readFile(join(__dirname, '..', 'public', '404.html'), async function (_err, html) { - try { - await axios({ - url: 'http://localhost:5050/path/to/nowhere', - headers: { - 'Content-Type': 'text/html', - Accept: 'text/html' - } - }) - assert.fail('Should never get here') - } catch (error: any) { - assert.equal(error.response.status, 404) - assert.equal(error.response.data, html.toString()) - done() - } - }) - }) - - it('serves a 500.html', (done) => { - fs.readFile(join(__dirname, '..', 'public', 'default.html'), async function (_err, html) { - try { - await axios({ - url: 'http://localhost:5050/error', - headers: { - 'Content-Type': 'text/html', - Accept: 'text/html' - } - }) - assert.fail('Should never get here') - } catch (error: any) { - assert.equal(error.response.status, 500) - assert.equal(error.response.data, html.toString()) - done() - } - }) - }) - }) - - describe('application/json format', () => { - it('500', async () => { - try { - await axios({ - url: 'http://localhost:5050/error', - headers: { - 'Content-Type': 'application/json', - Accept: 'application/json' - } - }) - assert.fail('Should never get here') - } catch (error: any) { - assert.equal(error.response.status, 500) - assert.deepEqual(error.response.data, { - name: 'GeneralError', - message: 'Something went wrong', - code: 500, - className: 'general-error' - }) - } - }) - - it('404', async () => { - try { - await axios({ - url: 'http://localhost:5050/path/to/nowhere', - headers: { - 'Content-Type': 'application/json', - Accept: 'application/json' - } - }) - assert.fail('Should never get here') - } catch (error: any) { - assert.equal(error.response.status, 404) - assert.deepEqual(error.response.data, { - name: 'NotFound', - message: 'File not found', - code: 404, - className: 'not-found' - }) - } - }) - - it('400', async () => { - try { - await axios({ - url: 'http://localhost:5050/bad-request', - headers: { - 'Content-Type': 'application/json', - Accept: 'application/json' - } - }) - assert.fail('Should never get here') - } catch (error: any) { - assert.equal(error.response.status, 400) - assert.deepEqual(error.response.data, { - name: 'BadRequest', - message: 'Invalid Password', - code: 400, - className: 'bad-request', - data: {}, - errors: [ - { - path: 'password', - value: null, - message: "'password' cannot be 'null'" - } - ] - }) - } - }) - }) - - it('returns JSON by default', async () => { - try { - await axios('http://localhost:5050/bad-request') - assert.fail('Should never get here') - } catch (error: any) { - assert.equal(error.response.status, 400) - assert.deepEqual(error.response.data, { - name: 'BadRequest', - message: 'Invalid Password', - code: 400, - className: 'bad-request', - data: {}, - errors: [ - { - path: 'password', - value: null, - message: "'password' cannot be 'null'" - } - ] - }) - } - }) - }) -}) diff --git a/packages/express/test/index.test.ts b/packages/express/test/index.test.ts deleted file mode 100644 index b22566f22d..0000000000 --- a/packages/express/test/index.test.ts +++ /dev/null @@ -1,291 +0,0 @@ -/* eslint-disable @typescript-eslint/ban-ts-comment */ -import { strict as assert } from 'assert' -import express, { 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' - -describe('@feathersjs/express', () => { - const service = { - async get(id: Id) { - return { id } - } - } - - it('exports .default, .original .rest, .notFound and .errorHandler', () => { - assert.strictEqual(original, express) - assert.strictEqual(typeof rest, 'function') - assert.ok(notFound) - assert.ok(errorHandler) - }) - - it('returns an Express application, keeps Feathers service and configuration typings typings', () => { - type Config = { - hostname: string - port: number - } - - const app = feathersExpress, Config>(feathers()) - - app.set('hostname', 'test.com') - - const hostname = app.get('hostname') - - assert.strictEqual(hostname, 'test.com') - assert.strictEqual(typeof app, 'function') - }) - - it('allows to use an existing Express instance', () => { - const expressApp = express() - const app = feathersExpress(feathers(), expressApp) - - assert.strictEqual(app, expressApp) - }) - - it('exports `express.rest`', () => { - assert.ok(typeof rest === 'function') - }) - - it('returns a plain express app when no app is provided', () => { - const app = feathersExpress() - - assert.strictEqual(typeof app.use, 'function') - assert.strictEqual(typeof app.service, 'undefined') - assert.strictEqual(typeof app.services, 'undefined') - }) - - it('errors when app with wrong version is provided', () => { - try { - // @ts-ignore - feathersExpress({}) - } catch (e: any) { - assert.strictEqual(e.message, '@feathersjs/express requires a valid Feathers application instance') - } - - try { - const app = feathers() - app.version = '2.9.9' - - feathersExpress(app) - } catch (e: any) { - assert.strictEqual( - e.message, - '@feathersjs/express requires an instance of a Feathers application version 3.x or later (got 2.9.9)' - ) - } - - try { - const app = feathers() - delete app.version - - feathersExpress(app) - } catch (e: any) { - assert.strictEqual( - e.message, - '@feathersjs/express requires an instance of a Feathers application version 3.x or later (got unknown)' - ) - } - }) - - it('Can use Express sub-apps', () => { - const typedApp = feathers>() - const app = feathersExpress(typedApp) - const child = express() - - app.use('/path', child) - assert.strictEqual((child as any).parent, app) - }) - - it('Can use express.static', () => { - const app = feathersExpress(feathers()) - - app.use('/path', serveStatic(__dirname)) - }) - - it('has Feathers functionality', async () => { - const app = feathersExpress(feathers()) - - app.use('/myservice', service) - - app.hooks({ - after: { - get(hook: HookContext) { - hook.result.fromAppHook = true - } - } - }) - - app.service('myservice').hooks({ - after: { - get(hook: HookContext) { - hook.result.fromHook = true - } - } - }) - - const data = await app.service('myservice').get(10) - - assert.deepStrictEqual(data, { - id: 10, - fromHook: true, - fromAppHook: true - }) - }) - - it('can register a service and start an Express server', async () => { - const app = feathersExpress(feathers()) - const response = { - message: 'Hello world' - } - - app.use('/myservice', service) - app.use((_req: Request, res: Response) => res.json(response)) - - const server = await app.listen(8787) - const data = await app.service('myservice').get(10) - - assert.deepStrictEqual(data, { id: 10 }) - - const res = await axios.get('http://localhost:8787') - assert.deepStrictEqual(res.data, response) - - await new Promise((resolve) => server.close(() => resolve(server))) - }) - - it('.listen calls .setup', async () => { - const app = feathersExpress(feathers()) - let called = false - - app.use('/myservice', { - async get(id: Id) { - return { id } - }, - - async setup(appParam, path) { - assert.strictEqual(appParam, app) - assert.strictEqual(path, 'myservice') - called = true - } - }) - - const server = await app.listen(8787) - - assert.ok(called) - await new Promise((resolve) => server.close(() => resolve(server))) - }) - - it('.teardown closes http server', async () => { - const app = feathersExpress(feathers()) - let called = false - - const server = await app.listen(8787) - server.on('close', () => { - called = true - }) - - await app.teardown() - assert.ok(called) - }) - - it('passes middleware as options', () => { - const feathersApp = feathers() - const app = feathersExpress(feathersApp) - const oldUse = feathersApp.use - const a = (_req: Request, _res: Response, next: NextFunction) => next() - const b = (_req: Request, _res: Response, next: NextFunction) => next() - const c = (_req: Request, _res: Response, next: NextFunction) => next() - const service = { - async get(id: Id) { - return { id } - } - } - - feathersApp.use = function (path, serviceArg, options) { - assert.strictEqual(path, '/myservice') - assert.strictEqual(serviceArg, service) - assert.deepStrictEqual(options.express, { - before: [a, b], - after: [c] - }) - // eslint-disable-next-line prefer-rest-params - return (oldUse as any).apply(this, arguments) - } - - app.use('/myservice', a, b, service, c) - }) - - it('Express wrapped and context.app are the same', async () => { - const app = feathersExpress(feathers()) - - app.use('/test', { - async get(id: Id) { - return { id } - } - }) - - app.service('test').hooks({ - before: { - get: [ - (context) => { - assert.ok(context.app === app) - } - ] - } - }) - - assert.deepStrictEqual(await app.service('test').get('testing'), { - id: 'testing' - }) - }) - - it('Works with HTTPS', (done) => { - const todoService = { - async get(name: Id) { - return { - id: name, - description: `You have to do ${name}!` - } - } - } - - const app = feathersExpress(feathers()).configure(rest()) - - app.use('/secureTodos', todoService) - - const httpsServer = https - .createServer( - { - key: fs.readFileSync(path.join(__dirname, '..', '..', 'tests', 'resources', 'privatekey.pem')), - cert: fs.readFileSync(path.join(__dirname, '..', '..', 'tests', 'resources', 'certificate.pem')), - rejectUnauthorized: false, - requestCert: false - }, - app as unknown as RequestListener - ) - .listen(7889) - - app.setup(httpsServer) - - httpsServer.on('listening', function () { - const instance = axios.create({ - httpsAgent: new https.Agent({ - rejectUnauthorized: false - }) - }) - - instance - .get('https://localhost:7889/secureTodos/dishes') - .then((response) => { - assert.ok(response.status === 200, 'Got OK status code') - assert.strictEqual(response.data.description, 'You have to do dishes!') - httpsServer.close(() => done()) - }) - .catch(done) - }) - }) -}) diff --git a/packages/express/test/not-found-handler.test.ts b/packages/express/test/not-found-handler.test.ts deleted file mode 100644 index 89db3cf1bd..0000000000 --- a/packages/express/test/not-found-handler.test.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { strict as assert } from 'assert' -import { NotFound } from '@feathersjs/errors' - -import { notFound } from '../src' - -const handler = notFound as any - -describe('not-found-handler', () => { - it('returns NotFound error', (done) => { - handler()( - { - url: 'some/where', - headers: {} - }, - {}, - function (error: any) { - assert.ok(error instanceof NotFound) - assert.equal(error.message, 'Page not found') - assert.deepEqual(error.data, { - url: 'some/where' - }) - done() - } - ) - }) - - it('returns NotFound error with URL when verbose', (done) => { - handler({ verbose: true })( - { - url: 'some/where', - headers: {} - }, - {}, - function (error: any) { - assert.ok(error instanceof NotFound) - assert.equal(error.message, 'Page not found: some/where') - assert.deepEqual(error.data, { - url: 'some/where' - }) - done() - } - ) - }) -}) diff --git a/packages/express/test/rest.test.ts b/packages/express/test/rest.test.ts deleted file mode 100644 index ddc9ff8574..0000000000 --- a/packages/express/test/rest.test.ts +++ /dev/null @@ -1,715 +0,0 @@ -/* eslint-disable @typescript-eslint/no-unused-vars */ -import { strict as assert } from 'assert' -import axios, { 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 { BadRequest } from '@feathersjs/errors' - -import * as express from '../src' - -const expressify = express.default -const { rest } = express -const errorHandler = express.errorHandler({ - logger: false -}) - -describe('@feathersjs/express/rest provider', () => { - describe('base functionality', () => { - it('throws an error if you did not expressify', () => { - const app = feathers() - - try { - app.configure(rest() as any) - assert.ok(false, 'Should never get here') - } catch (e: any) { - assert.strictEqual(e.message, '@feathersjs/express/rest needs an Express compatible app.') - } - }) - - it('lets you set the handler manually', async () => { - const app = expressify(feathers()) - - app - .configure( - rest(function (_req, res) { - res.format({ - 'text/plain'() { - res.end(`The todo is: ${res.data.description}`) - } - }) - }) - ) - .use('/todo', { - async get(id: Id) { - return { - description: `You have to do ${id}` - } - } - }) - - const server = await app.listen(4776) - - const res = await axios.get('http://localhost:4776/todo/dishes') - - assert.strictEqual(res.data, 'The todo is: You have to do dishes') - server.close() - }) - - it('lets you set no handler', async () => { - const app = expressify(feathers()) - const data = { fromHandler: true } - - app - .configure(rest(null)) - .use('/todo', { - async get(id: Id) { - return { - description: `You have to do ${id}` - } - } - }) - .use((_req: Request, res: Response) => res.json(data)) - - const server = await app.listen(5775) - const res = await axios.get('http://localhost:5775/todo-handler/dishes') - - assert.deepStrictEqual(res.data, data) - - server.close() - }) - }) - - describe('CRUD', () => { - let app: express.Application - - before(async () => { - app = expressify(feathers()) - .use(express.cors()) - .use(express.json()) - .configure(rest(express.formatter)) - .use('codes', { - async get(id: Id) { - return { id } - }, - - async create(data: any) { - return data - } - }) - .use('/', new Service()) - .use('todo', new Service()) - - app.hooks({ - setup: [ - async (context, next) => { - assert.ok(context.app) - await next() - } - ], - teardown: [ - async (context, next) => { - assert.ok(context.app) - await next() - } - ] - } as ApplicationHookMap) - - await app.listen(4777, () => app.use('tasks', new Service())) - }) - - after(() => app.teardown()) - - restTests('Services', 'todo', 4777) - restTests('Root Service', '/', 4777) - restTests('Dynamic Services', 'tasks', 4777) - - describe('res.hook', () => { - const convertHook = (hook: HookContext) => { - const result: any = Object.assign({}, hook.toJSON()) - - delete result.self - delete result.service - delete result.app - delete result.error - - return result - } - - it('sets the actual hook object in res.hook', async () => { - const params = { - route: {}, - query: { test: 'param' }, - provider: 'rest' - } - - app.use( - '/hook', - { - async get(id) { - return { - description: `You have to do ${id}` - } - } - }, - function (_req: Request, res: Response, next: NextFunction) { - res.data = convertHook(res.hook) - - next() - } - ) - - app.service('hook').hooks({ - after(hook: HookContext) { - hook.addedProperty = true - } - }) - - const res = await axios.get('http://localhost:4777/hook/dishes?test=param') - const paramsWithHeaders = { - ...params, - headers: res.data.params.headers - } - - assert.deepStrictEqual(res.data, { - id: 'dishes', - params: paramsWithHeaders, - arguments: ['dishes', paramsWithHeaders], - type: 'around', - method: 'get', - path: 'hook', - http: {}, - event: null, - result: { description: 'You have to do dishes' }, - addedProperty: true - }) - }) - - it('can use hook.dispatch', async () => { - app.use('/hook-dispatch', { - async get() { - return {} - } - }) - - app.service('hook-dispatch').hooks({ - after(hook: HookContext) { - hook.dispatch = { - id: hook.id, - fromDispatch: true - } - } - }) - - const res = await axios.get('http://localhost:4777/hook-dispatch/dishes') - assert.deepStrictEqual(res.data, { - id: 'dishes', - fromDispatch: true - }) - }) - - it('allows to set statusCode in a hook', async () => { - app.use('/hook-status', { - async get() { - return {} - } - }) - - app.service('hook-status').hooks({ - after(hook: HookContext) { - hook.http.status = 206 - } - }) - - const res = await axios.get('http://localhost:4777/hook-status/dishes') - - assert.strictEqual(res.status, 206) - }) - - it('allows to set response headers in a hook', async () => { - app.use('/hook-headers', { - async get() { - return {} - } - }) - - app.service('hook-headers').hooks({ - after(hook: HookContext) { - hook.http.headers = { foo: 'first', bar: ['second', 'third'] } - } - }) - - const res = await axios.get('http://localhost:4777/hook-headers/dishes') - - assert.strictEqual(res.headers.foo, 'first') - assert.strictEqual(res.headers.bar, 'second, third') - }) - - it('sets the hook object in res.hook on error', async () => { - const params = { - route: {}, - query: {}, - provider: 'rest' - } - - app.use('/hook-error', { - async get() { - throw new Error('I blew up') - } - }) - app.use(function (error: Error, _req: Request, res: Response, _next: NextFunction) { - res.status(500) - res.json({ - hook: convertHook(res.hook), - error: { - message: error.message - } - }) - }) - - try { - await axios('http://localhost:4777/hook-error/dishes') - assert.fail('Should never get here') - } catch (error: any) { - const { data } = error.response - const paramsWithHeaders = { - ...params, - headers: data.hook.params.headers - } - assert.deepStrictEqual(error.response.data, { - hook: { - id: 'dishes', - params: paramsWithHeaders, - arguments: ['dishes', paramsWithHeaders], - type: 'around', - event: null, - method: 'get', - path: 'hook-error', - http: {} - }, - error: { message: 'I blew up' } - }) - } - }) - }) - }) - - describe('middleware', () => { - it('sets service parameters and provider type', async () => { - const service = { - async get(_id: Id, params: Params) { - return params - } - } - - const app = expressify(feathers()) - .use(function (req: Request, _res: Response, next: NextFunction) { - req.feathers.test = 'Happy' - next() - }) - .configure(rest(express.formatter)) - .use('service', service) - const server = await app.listen(4778) - - const res = await axios.get('http://localhost:4778/service/bla?some=param&another=thing') - const expected = { - headers: res.data.headers, - test: 'Happy', - provider: 'rest', - route: {}, - query: { - some: 'param', - another: 'thing' - } - } - - assert.ok(res.status === 200, 'Got OK status code') - assert.deepStrictEqual(res.data, expected, 'Got params object back') - server.close() - }) - - it('Lets you configure your own middleware before the handler (#40)', async () => { - const data = { - description: 'Do dishes!', - id: 'dishes' - } - const app = expressify(feathers()) - - app - .use(function defaultContentTypeMiddleware(req, _res, next) { - req.headers['content-type'] = req.headers['content-type'] || 'application/json' - next() - }) - .use(express.json()) - .configure(rest(express.formatter)) - .use('/todo', { - async create(data: any) { - return data - } - }) - - const server = await app.listen(4775) - const res = await axios({ - url: 'http://localhost:4775/todo', - method: 'post', - data, - headers: { - 'content-type': '' - } - }) - - assert.deepStrictEqual(res.data, data) - server.close() - }) - - it('allows middleware before and after a service', async () => { - const app = expressify(feathers()) - - app - .use(express.json()) - .configure(rest()) - .use( - '/todo', - function (req, _res, next) { - req.body.before = ['before first'] - next() - }, - function (req, _res, next) { - req.body.before.push('before second') - next() - }, - { - async create(data: any) { - return data - } - }, - function (_req, res, next) { - res.data.after = ['after first'] - next() - }, - function (_req, res, next) { - res.data.after.push('after second') - next() - } - ) - - const server = await app.listen(4776) - const res = await axios.post('http://localhost:4776/todo', { - text: 'Do dishes' - }) - - assert.deepStrictEqual(res.data, { - text: 'Do dishes', - before: ['before first', 'before second'], - after: ['after first', 'after second'] - }) - - server.close() - }) - - it('allows middleware arrays before and after a service', async () => { - const app = expressify(feathers()) - - app.use(express.json()) - app.configure(rest()) - app.use( - '/todo', - [ - function (req: Request, _res: Response, next: NextFunction) { - req.body.before = ['before first'] - next() - }, - function (req: Request, _res: Response, next: NextFunction) { - req.body.before.push('before second') - next() - } - ], - { - async create(data) { - return data - } - }, - [ - function (_req: Request, res: Response, next: NextFunction) { - res.data.after = ['after first'] - next() - } - ], - function (_req: Request, res: Response, next: NextFunction) { - res.data.after.push('after second') - next() - } - ) - - const server = await app.listen(4776) - const res = await axios.post('http://localhost:4776/todo', { - text: 'Do dishes' - }) - - assert.deepStrictEqual(res.data, { - text: 'Do dishes', - before: ['before first', 'before second'], - after: ['after first', 'after second'] - }) - server.close() - }) - - it('allows an array of middleware without a service', async () => { - const app = expressify(feathers()) - const middlewareArray = [ - function (_req: Request, res: Response, next: NextFunction) { - res.data = ['first'] - next() - }, - function (_req: Request, res: Response, next: NextFunction) { - res.data.push('second') - next() - }, - function (req: Request, res: Response) { - res.data.push(req.body.text) - res.status(200).json(res.data) - } - ] - app.use(express.json()).configure(rest()).use('/array-middleware', middlewareArray) - - const server = await app.listen(4776) - const res = await axios.post('http://localhost:4776/array-middleware', { - text: 'Do dishes' - }) - - assert.deepStrictEqual(res.data, ['first', 'second', 'Do dishes']) - server.close() - }) - - it('formatter does nothing when there is no res.data', async () => { - const data = { message: 'It worked' } - const app = expressify(feathers()).use('/test', express.formatter, (_req: Request, res: Response) => - res.json(data) - ) - - const server = await app.listen(7988) - const res = await axios.get('http://localhost:7988/test') - - assert.deepStrictEqual(res.data, data) - server.close() - }) - }) - - describe('HTTP status codes', () => { - let app: express.Application - let server: Server - - before(async () => { - app = expressify(feathers()) - .configure(rest(express.formatter)) - .use('todo', { - async get(id: Id) { - return { - description: `You have to do ${id}` - } - }, - - async patch() { - throw new Error('Not implemented') - }, - - async find() { - return null - } - }) - - app.use(function (_req, res, next) { - if (typeof res.data !== 'undefined') { - next(new Error('Should never get here')) - } else { - next() - } - }) - - // Error handler - app.use(function (error: Error, _req: Request, res: Response, _next: NextFunction) { - if (res.statusCode < 400) { - res.status(500) - } - - res.json({ message: error.message }) - }) - - server = await app.listen(4780) - }) - - after((done) => server.close(done)) - - it('throws a 405 for undefined service methods (#99)', async () => { - const res = await axios.get('http://localhost:4780/todo/dishes') - - assert.ok(res.status === 200, 'Got OK status code for .get') - assert.deepStrictEqual( - res.data, - { - description: 'You have to do dishes' - }, - 'Got expected object' - ) - - try { - await axios.post('http://localhost:4780/todo') - assert.fail('Should never get here') - } catch (error: any) { - assert.ok(error.response.status === 405, 'Got 405 for .create') - assert.deepStrictEqual( - error.response.data, - { - message: 'Method `create` is not supported by this endpoint.' - }, - 'Error serialized as expected' - ) - } - }) - - it('throws a 404 for undefined route', async () => { - try { - await axios.get('http://localhost:4780/todo/foo/bar') - assert.fail('Should never get here') - } catch (error: any) { - assert.ok(error.response.status === 404, 'Got Not Found code') - } - }) - - it('empty response sets 204 status codes, does not run other middleware (#391)', async () => { - const res = await axios.get('http://localhost:4780/todo') - - assert.ok(res.status === 204, 'Got empty status code') - }) - }) - - describe('route parameters', () => { - let server: Server - let app: express.Application - - before(async () => { - app = expressify(feathers()) - .configure(rest()) - .use('/:appId/:id/todo', { - async get(id: Id, params: Params) { - if (params.query.error) { - throw new BadRequest('Not good') - } - - return { - id, - route: params.route - } - } - }) - .use(errorHandler) - - server = await app.listen(6880) - }) - - after((done) => server.close(done)) - - it('adds route params as `params.route` and allows id property (#76, #407)', async () => { - const expected = { - id: 'dishes', - route: { - appId: 'theApp', - id: 'myId' - } - } - - const res = await axios.get(`http://localhost:6880/theApp/myId/todo/${expected.id}`) - - assert.ok(res.status === 200, 'Got OK status code') - assert.deepStrictEqual(expected, res.data) - }) - - it('properly serializes error for nested routes (#1096)', async () => { - try { - await axios.get('http://localhost:6880/theApp/myId/todo/test?error=true') - assert.fail('Should never het here') - } catch (error: any) { - const { response } = error - - assert.strictEqual(response.status, 400) - assert.deepStrictEqual(response.data, { - name: 'BadRequest', - message: 'Not good', - code: 400, - className: 'bad-request' - }) - } - }) - }) - - describe('Custom methods', () => { - let server: Server - let app: express.Application - - before(async () => { - app = expressify(feathers()) - .use(express.json()) - .configure(rest()) - .use('/todo', new Service(), { - methods: ['find', 'customMethod'] - }) - .use(errorHandler) - - server = await app.listen(4781) - }) - - after((done) => server.close(done)) - - it('calls .customMethod with X-Service-Method header', async () => { - const payload = { text: 'Do dishes' } - const res = await axios.post('http://localhost:4781/todo', payload, { - headers: { - 'X-Service-Method': 'customMethod' - } - }) - - assert.deepEqual(res.data, { - data: payload, - method: 'customMethod', - provider: 'rest' - }) - }) - - it('throws MethodNotImplement for .setup, non option and default methods', async () => { - const options: AxiosRequestConfig = { - method: 'POST', - url: 'http://localhost:4781/todo', - data: { text: 'Do dishes' } - } - const testMethod = (name: string) => { - return assert.rejects( - () => - axios({ - ...options, - headers: { - 'X-Service-Method': name - } - }), - (error: any) => { - assert.deepEqual(error.response.data, { - name: 'MethodNotAllowed', - message: `Method \`${name}\` is not supported by this endpoint.`, - code: 405, - className: 'method-not-allowed' - }) - - return true - } - ) - } - - await testMethod('setup') - await testMethod('internalMethod') - await testMethod('nonExisting') - await testMethod('create') - await testMethod('find') - }) - }) -}) diff --git a/packages/express/tsconfig.json b/packages/express/tsconfig.json deleted file mode 100644 index 316fd41336..0000000000 --- a/packages/express/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig", - "include": [ - "src/**/*.ts" - ], - "compilerOptions": { - "outDir": "lib" - } -} diff --git a/packages/feathers/CHANGELOG.md b/packages/feathers/CHANGELOG.md index b0dbdfbf32..4d3da51d28 100644 --- a/packages/feathers/CHANGELOG.md +++ b/packages/feathers/CHANGELOG.md @@ -3,6 +3,36 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [6.0.0-pre.3](https://github.com/feathersjs/feathers/compare/v6.0.0-pre.2...v6.0.0-pre.3) (2025-10-10) + +### Bug Fixes + +- Fix redirect URI encoding ([#3621](https://github.com/feathersjs/feathers/issues/3621)) ([4dbcce5](https://github.com/feathersjs/feathers/commit/4dbcce598d894846899417cd51820a70b00f22e0)) + +# [6.0.0-pre.2](https://github.com/feathersjs/feathers/compare/v6.0.0-pre.1...v6.0.0-pre.2) (2025-09-04) + +### Bug Fixes + +- Add typesVersions for TypeScript compatibility ([87c181c](https://github.com/feathersjs/feathers/commit/87c181cf8d3bcd4f86d0caad41de83d220077ad8)) + +# [6.0.0-pre.1](https://github.com/feathersjs/feathers/compare/v6.0.0-pre.0...v6.0.0-pre.1) (2025-09-03) + +### Bug Fixes + +- Add compatibility exports ([#3605](https://github.com/feathersjs/feathers/issues/3605)) ([3aed869](https://github.com/feathersjs/feathers/commit/3aed8696ca95fe4a4351c2d7e7f274ab66b50c09)) +- Add registerPublisher method to protected method list ([2c0664a](https://github.com/feathersjs/feathers/commit/2c0664acf97dca3bf7a2efaf3564f04c3de5842e)) + +# [6.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v5.0.34...v6.0.0-pre.0) (2025-08-30) + +### Bug Fixes + +- Make handling of async iterables consistent ([#3602](https://github.com/feathersjs/feathers/issues/3602)) ([a29ea3c](https://github.com/feathersjs/feathers/commit/a29ea3c89bf0fe07f0aec823ef3f3e33941f1aa3)) + +### Features + +- SSE real-time events ([#3601](https://github.com/feathersjs/feathers/issues/3601)) ([fbfb75c](https://github.com/feathersjs/feathers/commit/fbfb75c5a2fde7ff785a71e787e746952b7a47b3)) +- V6 packages refactor ([#3596](https://github.com/feathersjs/feathers/issues/3596)) ([364aab5](https://github.com/feathersjs/feathers/commit/364aab563542fc9d6dd96c1f5f48b146727d7d1e)) + ## [5.0.34](https://github.com/feathersjs/feathers/compare/v5.0.33...v5.0.34) (2025-05-03) ### Bug Fixes diff --git a/packages/feathers/LICENSE b/packages/feathers/LICENSE index 7712f870f3..f9b502c69f 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 ecc774770b..0202868535 100644 --- a/packages/feathers/README.md +++ b/packages/feathers/README.md @@ -1,4 +1,4 @@ -Feathers logo +Feathers logo ## The API and real-time application framework @@ -6,9 +6,9 @@ [![Download Status](https://img.shields.io/npm/dm/@feathersjs/feathers.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/feathers) [![Discord](https://badgen.net/badge/icon/discord?icon=discord&label)](https://discord.gg/qa8kez8QBx) -Feathers is a lightweight web-framework for creating APIs and real-time applications using TypeScript or JavaScript. +Feathers is a full-stack framework for creating web APIs and real-time applications with TypeScript or JavaScript. -Feathers can interact with any backend technology, supports many databases out of the box and works with any frontend technology like React, VueJS, Angular, React Native, Android or iOS. +Feathers works with Node.js, Deno, Bun, Cloudflare Workers and standalone in the browser and can interact with any backend technology, supports many databases out of the box and works with any frontend like React, VueJS, Angular, React Native, Android or iOS. ## Getting started @@ -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/fixtures/client.ts b/packages/feathers/fixtures/client.ts new file mode 100644 index 0000000000..daa108184c --- /dev/null +++ b/packages/feathers/fixtures/client.ts @@ -0,0 +1,110 @@ +import { describe, it } from 'vitest' +import { strict as assert } from 'assert' +import { verify } from './fixture' + +export interface Todo { + text: string + complete?: boolean + id?: number +} + +export function clientTests(app: any, name: string) { + const getService = () => (name && typeof app.service === 'function' ? app.service(name) : app) + + describe('Service base tests', () => { + it('.find', async () => { + const todos = await getService().find() + + verify.find(todos) + }) + + it('.get and params passing', async () => { + const query = { + returnquery: 'true', + some: 'thing', + other: ['one', 'two'], + nested: { a: { b: 'object' } } + } + + const todo = await getService().get('0', { query }) + + verify.get('0', todo) + assert.deepStrictEqual(todo.query, query) + }) + + it('.create', async () => { + const data = { + text: 'created todo', + complete: true + } + const todo = await getService().create(data) + + verify.create(data, todo) + }) + + it('.create and created event', async () => { + const data = { text: 'created todo', complete: true } + const createPromise = new Promise((resolve) => { + getService().once('created', (current: Todo) => { + verify.create(data, current) + resolve(data) + }) + }) + + await getService().create(data) + await createPromise + }) + + it('.update and updated event', async () => { + const updateData = { + text: 'updated todo', + complete: true + } + const updatePromise = new Promise((resolve) => { + getService().once('updated', (current: Todo) => { + verify.update('42', updateData, current) + resolve(updateData) + }) + }) + + const todo = await getService().create({ text: 'todo to update', complete: false }) + await getService().update(todo.id, updateData) + await updatePromise + }) + + it('.patch and patched event', async () => { + const patchData = { complete: true, text: 'patched to do' } + const patchPromise = new Promise((resolve) => { + getService().once('patched', (current: Todo) => { + verify.patch('42', patchData, current) + resolve(current) + }) + }) + + const todo = await getService().create({ text: 'todo to patch', complete: false }) + await getService().patch(todo.id, patchData) + await patchPromise + }) + + it('.remove and removed event', async () => { + const todo = await getService().create({ text: 'todo to remove', complete: false }) + const removePromise = new Promise((resolve) => { + getService().once('removed', (current: Todo) => { + verify.remove('42', current) + resolve(current) + }) + }) + + await getService().remove(todo.id) + await removePromise + }) + + it('.get with error', async () => { + const query = { error: true } + + await assert.rejects(() => getService().get(0, { query }), { + message: 'Something for 0 went wrong' + }) + }) + }) +} diff --git a/packages/tests/src/fixture.ts b/packages/feathers/fixtures/fixture.ts similarity index 80% rename from packages/tests/src/fixture.ts rename to packages/feathers/fixtures/fixture.ts index 2e7bbb3fbf..329eb6933c 100644 --- a/packages/tests/src/fixture.ts +++ b/packages/feathers/fixtures/fixture.ts @@ -1,4 +1,5 @@ -import assert from 'assert' +import assert from 'node:assert' +import { NotAcceptable, NotFound } from '../src/errors' const clone = (data: any) => JSON.parse(JSON.stringify(data)) @@ -13,7 +14,7 @@ const findAllData = [ } ] -export class Service { +export class TestService { events = ['log'] async find() { @@ -21,19 +22,37 @@ export class Service { } async get(name: string, params: any) { - if (params.query.error) { + const { query = {}, headers } = params + + if (query.error) { throw new Error(`Something for ${name} went wrong`) } - if (params.query.runtimeError) { + if (query.runtimeError) { // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore thingThatDoesNotExist() // eslint-disable-line } + if (name === 'nocontent') { + return null + } + + if (name === 'notfound') { + throw new NotFound('Not found') + } + + if (name === 'notacceptable') { + throw new NotAcceptable('This is a Feathers error', { + testData: true + }) + } + return Promise.resolve({ id: name, - description: `You have to do ${name}!` + description: `You have to do ${name}!`, + ...(query.returnquery ? { query } : {}), + ...(query.returnheaders ? { headers } : {}) }) } diff --git a/packages/feathers/fixtures/index.ts b/packages/feathers/fixtures/index.ts new file mode 100644 index 0000000000..23e06851c0 --- /dev/null +++ b/packages/feathers/fixtures/index.ts @@ -0,0 +1,78 @@ +import { createServerAdapter } from '@whatwg-node/server' +import { createServer } from 'node:http' +import { TestService } from './fixture.js' + +import { feathers, Application, Params } from '../src/index.js' +import { createHandler, SseService } from '../src/http/index.js' + +export * from './client.js' +export * from './rest.js' +export * from './fixture.js' + +export class ResponseTestService { + async find() { + return new Response('Plain text', { + headers: { + 'Content-Type': 'text/plain', + 'X-Custom-Header': 'test' + } + }) + } + + async get(id: string) { + const generator = async function* () { + for (let i = 1; i <= 5; i++) { + yield { message: `Hello ${id} ${i}` } + await new Promise((resolve) => setTimeout(resolve, 50)) + } + } + + return generator() + } + + async options(_params: Params) { + return new Response(null, { + status: 200, + headers: { + 'X-Feathers': 'true', + 'Access-Control-Allow-Origin': 'https://example.com', + 'Access-Control-Allow-Headers': 'Authorization, X-Service-Method' + } + }) + } +} + +export type TestServiceTypes = { + todos: TestService + test: ResponseTestService + sse: SseService +} + +export type TestApplication = Application + +export function getApp(): TestApplication { + const app: TestApplication = feathers() + + app.use('todos', new TestService(), { + methods: ['find', 'get', 'create', 'update', 'patch', 'remove', 'customMethod'] + }) + app.use('test', new ResponseTestService()) + app.use('sse', new SseService()) + + return app +} + +export async function createTestServer(port: number, app: TestApplication) { + const handler = createHandler(app) + // You can create your Node server instance by using our adapter + const nodeServer = createServer(createServerAdapter(handler)) + + await new Promise((resolve) => { + // Then start listening on some port + nodeServer.listen(port, () => resolve()) + }) + + await app.setup(nodeServer) + + return nodeServer +} diff --git a/packages/feathers/fixtures/rest.ts b/packages/feathers/fixtures/rest.ts new file mode 100644 index 0000000000..9e65221bf8 --- /dev/null +++ b/packages/feathers/fixtures/rest.ts @@ -0,0 +1,136 @@ +import { describe, it } from 'vitest' +import assert from 'assert' + +import { verify } from './fixture' + +export function restTests(description: string, name: string, port: number) { + describe(description, () => { + it('GET .find', async () => { + const response = await fetch(`http://localhost:${port}/${name}`) + const data = await response.json() + + assert.ok(response.status === 200, 'Got OK status code') + verify.find(data) + }) + + it('GET .get', async () => { + const response = await fetch(`http://localhost:${port}/${name}/dishes`) + const data = await response.json() + + assert.ok(response.status === 200, 'Got OK status code') + verify.get('dishes', data) + }) + + it('POST .create', async () => { + const original = { + description: 'POST .create' + } + + const response = await fetch(`http://localhost:${port}/${name}`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify(original) + }) + const data = await response.json() + + assert.ok(response.status === 201, 'Got CREATED status code') + verify.create(original, data) + }) + + it('PUT .update', async () => { + const original = { + description: 'PUT .update' + } + + const response = await fetch(`http://localhost:${port}/${name}/544`, { + method: 'PUT', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify(original) + }) + const data = await response.json() + + assert.ok(response.status === 200, 'Got OK status code') + verify.update('544', original, data) + }) + + it('PUT .update many', async () => { + const original = { + description: 'PUT .update', + many: true + } + + const response = await fetch(`http://localhost:${port}/${name}`, { + method: 'PUT', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify(original) + }) + const data = await response.json() + + assert.ok(response.status === 200, 'Got OK status code') + verify.update(null, original, data) + }) + + it('PATCH .patch', async () => { + const original = { + description: 'PATCH .patch' + } + + const response = await fetch(`http://localhost:${port}/${name}/544`, { + method: 'PATCH', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify(original) + }) + const data = await response.json() + + assert.ok(response.status === 200, 'Got OK status code') + verify.patch('544', original, data) + }) + + it('PATCH .patch many', async () => { + const original = { + description: 'PATCH .patch', + many: true + } + + const response = await fetch(`http://localhost:${port}/${name}`, { + method: 'PATCH', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify(original) + }) + const data = await response.json() + + assert.ok(response.status === 200, 'Got OK status code') + verify.patch(null, original, data) + }) + + it('DELETE .remove', async () => { + const response = await fetch(`http://localhost:${port}/${name}/233`, { + method: 'DELETE' + }) + const data = await response.json() + + assert.ok(response.status === 200, 'Got OK status code') + verify.remove('233', data) + }) + + it('DELETE .remove many', async () => { + const response = await fetch(`http://localhost:${port}/${name}`, { + method: 'DELETE' + }) + const data = await response.json() + + assert.ok(response.status === 200, 'Got OK status code') + verify.remove(null, data) + }) + }) +} diff --git a/packages/feathers/package.json b/packages/feathers/package.json index 370a290a76..a7995b5c37 100644 --- a/packages/feathers/package.json +++ b/packages/feathers/package.json @@ -1,8 +1,8 @@ { - "name": "@feathersjs/feathers", - "description": "A framework for real-time applications and REST API with JavaScript and TypeScript", - "version": "5.0.34", - "homepage": "http://feathersjs.com", + "name": "feathers", + "description": "The API and real-time application framework", + "version": "6.0.0-pre.3", + "homepage": "https://feathersjs.com", "repository": { "type": "git", "url": "git://github.com/feathersjs/feathers.git", @@ -11,11 +11,40 @@ "keywords": [ "feathers", "REST", - "socket.io", - "realtime" + "realtime", + "framework", + "API" ], - "main": "lib/", - "types": "lib/", + "type": "module", + "main": "lib/index.js", + "types": "lib/index.d.ts", + "exports": { + ".": "./lib/index.js", + "./hooks": "./lib/hooks/index.js", + "./commons": "./lib/commons.js", + "./errors": "./lib/errors.js", + "./client": "./lib/client/index.js", + "./http": "./lib/http/index.js" + }, + "typesVersions": { + "*": { + "errors": [ + "./lib/errors.d.ts" + ], + "hooks": [ + "./lib/hooks/index.d.ts" + ], + "commons": [ + "./lib/commons.d.ts" + ], + "client": [ + "./lib/client/index.d.ts" + ], + "http": [ + "./lib/http/index.d.ts" + ] + } + }, "author": { "name": "Feathers contributors", "email": "hello@feathersjs.com", @@ -37,9 +66,7 @@ "LICENSE", "README.md", "src/**", - "lib/**", - "*.d.ts", - "*.js" + "lib/**" ], "scripts": { "write-version": "node -e \"console.log('export default \\'' + require('./package.json').version + '\\'')\" > src/version.ts", @@ -47,28 +74,28 @@ "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/" + "compile": "shx rm -rf lib/ && tsc", + "dev": "vitest", + "test": "vitest run --coverage" }, "engines": { - "node": ">= 12" + "node": ">= 20" }, "publishConfig": { "access": "public" }, "dependencies": { - "@feathersjs/commons": "^5.0.34", - "@feathersjs/hooks": "^0.9.0", - "events": "^3.3.0" + "@types/qs": "^6.14.0", + "events": "^3.3.0", + "qs": "^6.14.0" }, "devDependencies": { - "@types/mocha": "^10.0.10", "@types/node": "^24.1.0", - "mocha": "^11.7.1", + "@vitest/coverage-v8": "^3.2.4", + "@whatwg-node/server": "^0.10.12", "shx": "^0.4.0", - "ts-node": "^10.9.2", - "typescript": "^5.9.2" + "typescript": "^5.8.0", + "vitest": "^3.2.4" }, "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" } diff --git a/packages/feathers/test/application.test.ts b/packages/feathers/src/application.test.ts similarity index 86% rename from packages/feathers/test/application.test.ts rename to packages/feathers/src/application.test.ts index ea5a937741..337508552c 100644 --- a/packages/feathers/test/application.test.ts +++ b/packages/feathers/src/application.test.ts @@ -1,6 +1,7 @@ -/* eslint-disable @typescript-eslint/ban-ts-comment, @typescript-eslint/no-empty-function */ +/* eslint-disable @typescript-eslint/ban-ts-comment */ +import { describe, it } from 'vitest' import assert from 'assert' -import { feathers, Feathers, getServiceOptions, Id, version } from '../src' +import { feathers, Feathers, getServiceOptions, Id, version } from '../src/index.js' describe('Feathers application', () => { it('initializes', () => { @@ -16,16 +17,19 @@ describe('Feathers application', () => { assert.ok(app.version > '5.0.0') }) - it('is an event emitter', (done) => { + it('is an event emitter', async () => { const app = feathers() const original = { hello: 'world' } - app.on('test', (data: any) => { - assert.deepStrictEqual(original, data) - done() + const promise = new Promise((resolve) => { + app.on('test', (data: any) => { + assert.deepStrictEqual(original, data) + resolve() + }) }) app.emit('test', original) + await promise }) it('uses .defaultService if available', async () => { @@ -55,10 +59,12 @@ describe('Feathers application', () => { }) }) - it('additionally passes `app` as .configure parameter (#558)', (done) => { - feathers().configure(function (app) { - assert.strictEqual(this, app) - done() + it('additionally passes `app` as .configure parameter (#558)', async () => { + await new Promise((resolve) => { + feathers().configure(function (app) { + assert.strictEqual(this, app) + resolve() + }) }) }) @@ -164,6 +170,15 @@ describe('Feathers application', () => { message: "'teardown' on service 'dummy' is not allowed as a custom method name" } ) + assert.throws( + () => + feathers().use('/dummy', dummyService, { + methods: ['create', 'registerPublisher'] + }), + { + message: "'registerPublisher' on service 'dummy' is not allowed as a custom method name" + } + ) }) it('can register service with no external methods', async () => { @@ -190,7 +205,7 @@ describe('Feathers application', () => { assert.deepStrictEqual(result, { id: 'test' }) }) - it('services can be re-used (#566)', (done) => { + it('services can be re-used (#566)', async () => { const service = { async create(data: any) { return data @@ -199,35 +214,28 @@ describe('Feathers application', () => { const app1 = feathers<{ dummy: typeof service; testing: any }>() const app2 = feathers<{ dummy: typeof service; testing: any }>() - app2.use('dummy', { - async create(data: any) { - return data - } - }) + app1.use('dummy', service) + app2.use('dummy', service) const dummy = app2.service('dummy') dummy.hooks({ before: { create: [ - (hook) => { - hook.data.fromHook = true + async (context: any) => { + context.data.fromHook = true + return context } ] } }) - dummy.on('created', (data: any) => { - assert.deepStrictEqual(data, { - message: 'Hi', - fromHook: true - }) - done() - }) - - app1.use('testing', app2.service('dummy')) + const result = await dummy.create({ message: 'Hello' }) - app1.service('testing').create({ message: 'Hi' }) + assert.deepStrictEqual(result, { + message: 'Hello', + fromHook: true + }) }) it('async hooks run before regular hooks', async () => { @@ -406,7 +414,7 @@ describe('Feathers application', () => { assert.strictEqual(teardownCount, 2) }) - it('registering app.setup but while still pending will be set up', (done) => { + it('registering app.setup but while still pending will be set up', async () => { const app = feathers() app.setup() @@ -416,7 +424,6 @@ describe('Feathers application', () => { assert.ok((app as any)._isSetup) assert.strictEqual(appRef, app) assert.strictEqual(path, 'dummy') - done() } }) }) @@ -507,7 +514,7 @@ describe('Feathers application', () => { }) describe('sub apps', () => { - it('re-registers sub-app services with prefix', (done) => { + it('re-registers sub-app services with prefix', async () => { const app = feathers() const subApp = feathers() @@ -535,34 +542,25 @@ describe('Feathers application', () => { app.use('/api/', subApp) - app.service('/api/service2').once('created', (data: any) => { - assert.deepStrictEqual(data, { - message: 'This is a test' - }) - - subApp.service('service2').once('created', (data: any) => { - assert.deepStrictEqual(data, { - message: 'This is another test' - }) + const result1 = await app.service('/api/service1').get(10) + assert.strictEqual(result1.name, 'service1') - done() - }) + const result2 = await app.service('/api/service2').get(1) + assert.strictEqual(result2.name, 'service2') - app.service('api/service2').create({ - message: 'This is another test' - }) + const result3 = await subApp.service('service2').create({ + message: 'This is a test' + }) + assert.deepStrictEqual(result3, { + message: 'This is a test' }) - ;(async () => { - let data = await app.service('/api/service1').get(10) - assert.strictEqual(data.name, 'service1') - - data = await app.service('/api/service2').get(1) - assert.strictEqual(data.name, 'service2') - await subApp.service('service2').create({ - message: 'This is a test' - }) - })() + const result4 = await app.service('/api/service2').create({ + message: 'This is another test' + }) + assert.deepStrictEqual(result4, { + message: 'This is another test' + }) }) }) }) diff --git a/packages/feathers/src/application.ts b/packages/feathers/src/application.ts index 6abf661b1e..1033284c84 100644 --- a/packages/feathers/src/application.ts +++ b/packages/feathers/src/application.ts @@ -1,11 +1,14 @@ -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 { +import { HOOKS, hooks, middleware } from './hooks/index.js' + +import { stripSlashes } from './commons.js' +import { createDebug } from './debug.js' + +import version from './version.js' +import { eventHook, eventMixin } from './events.js' +import { hookMixin } from './hooks.js' +import { wrapService, getServiceOptions, protectedMethods, defaultServiceEvents } from './service.js' +import type { FeathersApplication, ServiceMixin, Service, @@ -14,10 +17,15 @@ import { Application, FeathersService, ApplicationHookOptions -} from './declarations' -import { enableHooks } from './hooks' +} from './declarations.js' +import { enableHooks } from './hooks.js' +import { Router } from './router.js' +import { Channel } from './channel/base.js' +import { CombinedChannel } from './channel/combined.js' +import { channelServiceMixin, Event, Publisher, PUBLISHERS, ALL_EVENTS, CHANNELS } from './channel/mixin.js' const debug = createDebug('@feathersjs/feathers') +const channelDebug = createDebug('@feathersjs/transport-commons/channels') export class Feathers extends EventEmitter @@ -27,10 +35,15 @@ export class Feathers settings: Settings = {} as Settings mixins: ServiceMixin>[] = [hookMixin, eventMixin] version: string = version + routes: Router = new Router() _isSetup = false protected registerHooks: (this: any, allHooks: any) => any + // Channel-related properties + public [CHANNELS]: { [key: string]: Channel } = {} + public [PUBLISHERS]: { [ALL_EVENTS]?: Publisher; [key: string]: Publisher } = {} + constructor() { super() this.registerHooks = enableHooks(this) @@ -39,6 +52,67 @@ export class Feathers }) } + get channels(): string[] { + return Object.keys(this[CHANNELS]) + } + + channel(...names: string[]): Channel { + channelDebug('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) + } + + publish(event: Event | Publisher, publisher?: Publisher): this { + return this.registerPublisher(event, publisher) + } + + registerPublisher(event: Event | Publisher, publisher?: Publisher): this { + channelDebug('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 as string)) { + throw new Error(`'${event.toString()}' is not a valid service event`) + } + + const publishers = this[PUBLISHERS] + publishers[event as string] = publisher! + + return this + } + get(name: L): Settings[L] { return this.settings[name] } @@ -72,6 +146,23 @@ export class Feathers return current as any } + lookup(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 } + } + protected _setup() { this._isSetup = true @@ -165,6 +256,10 @@ export class Feathers const protoService = wrapService(location, service, options as ServiceOptions) const serviceOptions = getServiceOptions(protoService) + const routerParams = { + service: protoService, + params: serviceOptions.routeParams || {} + } for (const name of protectedMethods) { if (serviceOptions.methods.includes(name)) { @@ -177,6 +272,11 @@ export class Feathers // Add all the mixins this.mixins.forEach((fn) => fn.call(this, protoService, location, serviceOptions)) + // Add channel publishing functionality to the service + channelServiceMixin(this as any)(protoService, location, serviceOptions) + + this.routes.insert(path, routerParams) + this.routes.insert(`${path}/:__id`, routerParams) this.services[location] = protoService // If we ran setup already, set this service up explicitly, this will not `await` @@ -200,6 +300,9 @@ export class Feathers delete this.services[path] + this.routes.remove(path) + this.routes.remove(`${path}/:__id`) + return service as any } diff --git a/packages/transport-commons/src/channels/channel/base.ts b/packages/feathers/src/channel/base.ts similarity index 95% rename from packages/transport-commons/src/channels/channel/base.ts rename to packages/feathers/src/channel/base.ts index 4717393880..1c2f2fb4e2 100644 --- a/packages/transport-commons/src/channels/channel/base.ts +++ b/packages/feathers/src/channel/base.ts @@ -1,5 +1,5 @@ import { EventEmitter } from 'events' -import { RealTimeConnection } from '@feathersjs/feathers' +import { RealTimeConnection } from '../declarations.js' export class Channel extends EventEmitter { connections: RealTimeConnection[] diff --git a/packages/transport-commons/test/channels/channel.test.ts b/packages/feathers/src/channel/channel.test.ts similarity index 93% rename from packages/transport-commons/test/channels/channel.test.ts rename to packages/feathers/src/channel/channel.test.ts index 2e9502d9db..4e95d450d6 100644 --- a/packages/transport-commons/test/channels/channel.test.ts +++ b/packages/feathers/src/channel/channel.test.ts @@ -1,17 +1,15 @@ -/* eslint-disable @typescript-eslint/no-empty-function */ +import { describe, it, beforeEach } from 'vitest' 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 { feathers, Application, RealTimeConnection } from '../index.js' +import { Channel } from './base.js' +import { CombinedChannel } from './combined.js' +import { CHANNELS } from './mixin.js' describe('app.channel', () => { let app: Application beforeEach(() => { - app = feathers().configure(channels()) + app = feathers() }) describe('base channels', () => { @@ -115,16 +113,20 @@ describe('app.channel', () => { }) }) - it('empty', (done) => { + it('empty', async () => { const channel = app.channel('test') const c1 = { id: 1 } const c2 = { id: 2 } - channel.once('empty', done) + const promise = new Promise((resolve) => { + channel.once('empty', resolve) + }) channel.join(c1, c2) channel.leave(c1) channel.leave(c2) + + await promise }) it('removes an empty channel', () => { diff --git a/packages/transport-commons/src/channels/channel/combined.ts b/packages/feathers/src/channel/combined.ts similarity index 93% rename from packages/transport-commons/src/channels/channel/combined.ts rename to packages/feathers/src/channel/combined.ts index c6723f61d9..2b6bf0f178 100644 --- a/packages/transport-commons/src/channels/channel/combined.ts +++ b/packages/feathers/src/channel/combined.ts @@ -1,5 +1,5 @@ -import { RealTimeConnection } from '@feathersjs/feathers' -import { Channel } from './base' +import { RealTimeConnection } from '../declarations.js' +import { Channel } from './base.js' function collectConnections(children: Channel[]) { const mappings = new WeakMap() diff --git a/packages/feathers/src/channel/dispatch.test.ts b/packages/feathers/src/channel/dispatch.test.ts new file mode 100644 index 0000000000..ad3b3832a7 --- /dev/null +++ b/packages/feathers/src/channel/dispatch.test.ts @@ -0,0 +1,264 @@ +import { describe, it, beforeEach } from 'vitest' +import assert from 'assert' +import { feathers, Application, HookContext } from '../index.js' +import { Channel } from './base.js' +import { CombinedChannel } from './combined.js' + +class TestService { + events = ['foo'] + + async create(payload: any) { + return payload + } +} + +describe('app.publish', () => { + let app: Application + + beforeEach(() => { + app = feathers() + }) + + it('throws an error if service does not send the event', () => { + try { + app.use('/test', { + create(data: any) { + return Promise.resolve(data) + } + }) + + app.service('test').registerPublisher('created', function () {}) + app.service('test').registerPublisher('bla', function () {}) + assert.ok(false, 'Should never get here') + } catch (e: any) { + assert.strictEqual(e.message, "'bla' is not a valid service event") + } + }) + + describe('registration and `dispatch` event', () => { + const c1 = { id: 1, test: true } + const c2 = { id: 2, test: true } + const data = { message: 'This is a test' } + + beforeEach(() => { + app.use('/test', new TestService()) + }) + + it('error in publisher is handled gracefully (#1707)', async () => { + app.service('test').publish('created', () => { + throw new Error('Something went wrong') + }) + + try { + await app.service('test').create({ message: 'something' }) + } catch (_error: any) { + assert.fail('Should never get here') + } + }) + + it('simple event registration and dispatching', async () => { + app.channel('testing').join(c1) + + app.service('test').registerPublisher('created', () => app.channel('testing')) + + const publishPromise = new Promise((resolve, reject) => { + app.once('publish', (event: string, channel: Channel, hook: HookContext) => { + try { + assert.strictEqual(event, 'created') + assert.strictEqual(hook.path, 'test') + assert.deepStrictEqual(hook.result, data) + assert.deepStrictEqual(channel.connections, [c1]) + resolve() + } catch (error: any) { + reject(error) + } + }) + }) + + await app.service('test').create(data) + await publishPromise + }) + + it('app and global level dispatching and precedence', async () => { + app.channel('testing').join(c1) + app.channel('other').join(c2) + + app.registerPublisher('created', () => app.channel('testing')) + app.registerPublisher(() => app.channel('other')) + + const publishPromise = new Promise((resolve) => { + app.once('publish', (_event: string, channel: Channel) => { + assert.ok(channel.connections.indexOf(c1) !== -1) + resolve() + }) + }) + + await app.service('test').create(data) + await publishPromise + }) + + it('promise event dispatching', async () => { + app.channel('testing').join(c1) + app.channel('othertest').join(c2) + + app + .service('test') + .registerPublisher( + 'created', + () => new Promise((resolve) => setTimeout(() => resolve(app.channel('testing')), 50)) + ) + app + .service('test') + .registerPublisher( + 'created', + () => new Promise((resolve) => setTimeout(() => resolve(app.channel('testing', 'othertest')), 100)) + ) + + const publishPromise = new Promise((resolve) => { + app.once('publish', (_event: string, channel: Channel, hook: HookContext) => { + assert.deepStrictEqual(hook.result, data) + assert.deepStrictEqual(channel.connections, [c1, c2]) + resolve() + }) + }) + + await app.service('test').create(data) + await publishPromise + }) + + it('custom event dispatching', async () => { + const eventData = { testing: true } + + app.channel('testing').join(c1) + app.channel('othertest').join(c2) + + app.service('test').registerPublisher('foo', () => app.channel('testing')) + + const publishPromise = new Promise((resolve) => { + app.once('publish', (event: string, channel: Channel, hook: HookContext) => { + assert.strictEqual(event, 'foo') + assert.deepStrictEqual(hook, { + app, + path: 'test', + service: app.service('test'), + result: eventData + }) + assert.deepStrictEqual(channel.connections, [c1]) + resolve() + }) + }) + + app.service('test').emit('foo', eventData) + await publishPromise + }) + + it('does not sent `dispatch` event if there are no dispatchers', async () => { + const publishPromise = new Promise((resolve, reject) => { + app.once('publish', () => reject(new Error('Should never get here'))) + + // Set a timeout to resolve the promise if no publish event occurs + setTimeout(resolve, 100) + }) + + await app.service('test').create(data) + await publishPromise + }) + + it('does not send `dispatch` event if there are no connections', async () => { + app.service('test').registerPublisher('created', () => app.channel('dummy')) + + const publishPromise = new Promise((resolve, reject) => { + app.once('publish', () => reject(new Error('Should never get here'))) + + // Set a timeout to resolve the promise if no publish event occurs + setTimeout(resolve, 100) + }) + + await app.service('test').create(data) + await publishPromise + }) + + it('dispatcher returning an array of channels', async () => { + app.channel('testing').join(c1) + app.channel('othertest').join(c2) + + app + .service('test') + .registerPublisher('created', () => [app.channel('testing'), app.channel('othertest')]) + + const publishPromise = new Promise((resolve) => { + app.once('publish', (_event: string, channel: Channel, hook: HookContext) => { + assert.deepStrictEqual(hook.result, data) + assert.deepStrictEqual(channel.connections, [c1, c2]) + resolve() + }) + }) + + await app.service('test').create(data) + await publishPromise + }) + + it('dispatcher can send data', async () => { + const c1data = { channel: 'testing' } + + app.channel('testing').join(c1) + app.channel('othertest').join(c2) + + app + .service('test') + .registerPublisher('created', () => [app.channel('testing').send(c1data), app.channel('othertest')]) + + const publishPromise = new Promise((resolve) => { + app.once('publish', (_event: string, channel: CombinedChannel, hook: HookContext) => { + assert.deepStrictEqual(hook.result, data) + assert.deepStrictEqual(channel.dataFor(c1), c1data) + assert.ok(channel.dataFor(c2) === null) + assert.deepStrictEqual(channel.connections, [c1, c2]) + resolve() + }) + }) + + await app.service('test').create(data) + await publishPromise + }) + + it('publisher precedence and preventing publishing', async () => { + app.channel('test').join(c1) + + app.registerPublisher(() => app.channel('test')) + app.service('test').registerPublisher('created', (): null => null) + + const publishPromise = new Promise((resolve, reject) => { + app.once('publish', () => reject(new Error('Should never get here'))) + + // Set a timeout to resolve the promise if no publish event occurs + setTimeout(resolve, 100) + }) + + await app.service('test').create(data) + await publishPromise + }) + + it('data of first channel has precedence', async () => { + const sendData = { test: true } + + app.channel('testing').join(c1) + app.channel('othertest').join(c1) + + app.service('test').registerPublisher('created', () => { + return [app.channel('testing'), app.channel('othertest').send(sendData)] + }) + + const publishPromise = new Promise((resolve) => { + app.once('publish', (_event: string, channel: CombinedChannel) => { + assert.strictEqual(channel.dataFor(c1), null) + assert.deepStrictEqual(channel.connections, [c1]) + resolve() + }) + }) + + await app.service('test').create(data) + await publishPromise + }) + }) +}) diff --git a/packages/feathers/src/channel/mixin.ts b/packages/feathers/src/channel/mixin.ts new file mode 100644 index 0000000000..24fa383275 --- /dev/null +++ b/packages/feathers/src/channel/mixin.ts @@ -0,0 +1,102 @@ +import { createDebug } from '../debug.js' +import type { ServiceOptions, HookContext, Application } from '../declarations.js' +import { Channel } from './base.js' +import { CombinedChannel } from './combined.js' + +const debug = createDebug('@feathersjs/transport-commons/channels') + +const CHANNELS = Symbol.for('@feathersjs/transport-commons/channels') +const PUBLISHERS = Symbol.for('@feathersjs/transport-commons/publishers') +const ALL_EVENTS = Symbol.for('@feathersjs/transport-commons/all-events') + +function flattenDeep(arr: Array): T[] { + return arr.reduce((flat: T[], toFlatten: T | T[]) => { + return flat.concat(Array.isArray(toFlatten) ? flattenDeep(toFlatten) : toFlatten) + }, []) +} + +export type Event = string | typeof ALL_EVENTS + +export type Publisher = ( + data: T, + context: HookContext +) => Channel | Channel[] | void | Promise + +export function channelServiceMixin(app: Application) { + return (service: any, path: string, serviceOptions: ServiceOptions) => { + const { serviceEvents } = serviceOptions + + if (typeof service.publish === 'function') { + return + } + + // Add publish methods to service + service[PUBLISHERS] = {} + service.publish = function (event: Event | Publisher, publisher?: Publisher) { + return (service as any).registerPublisher(event, publisher) + } + service.registerPublisher = function (event: Event | Publisher, publisher?: Publisher) { + debug('Registering service publisher', event) + + if (!publisher && typeof event === 'function') { + publisher = event + event = ALL_EVENTS + } + + if (event !== ALL_EVENTS && !serviceEvents!.includes(event as string)) { + throw new Error(`'${event.toString()}' is not a valid service event`) + } + + const publishers = (service as any)[PUBLISHERS] + publishers[event as string] = publisher! + + return service + } + + serviceEvents!.forEach((event: string) => { + service.on(event, (data: unknown, hook: HookContext) => { + if (!hook) { + hook = { path, service, app, result: data } as HookContext + } + + debug('Publishing event', event, hook.path) + + const logError = (error: any) => debug(`Error in '${hook.path} ${event}' publisher`, error) + const servicePublishers = (service as any)[PUBLISHERS] + const appPublishers = (app as any)[PUBLISHERS] + + const publisher = + servicePublishers[event] || + servicePublishers[ALL_EVENTS] || + appPublishers[event] || + appPublishers[ALL_EVENTS] || + (() => {}) + + 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 { PUBLISHERS, ALL_EVENTS, CHANNELS } diff --git a/packages/feathers/src/client/fetch.test.ts b/packages/feathers/src/client/fetch.test.ts new file mode 100644 index 0000000000..25008f1363 --- /dev/null +++ b/packages/feathers/src/client/fetch.test.ts @@ -0,0 +1,135 @@ +import { beforeAll, describe, it, expect } from 'vitest' +import { feathers } from '../index.js' +import { clientTests } from '../../fixtures/client.js' +import { NotAcceptable, NotFound, MethodNotAllowed } from '../errors.js' + +import { getApp, createTestServer, TestServiceTypes, verify } from '../../fixtures/index.js' +import { fetchClient } from './index.js' + +describe('fetch REST connector', function () { + const port = 8888 + const baseUrl = `http://localhost:${port}` + const connection = fetchClient(fetch, { baseUrl }) + const app = feathers().configure(connection) + const service = app.service('todos') + + beforeAll(async () => { + const testApp = getApp() + await createTestServer(port, testApp) + }) + + it('supports custom headers', async () => { + const headers = { + Authorization: 'let-me-in' + } + const todo = await service.get('taxes', { + headers, + query: { returnheaders: true } + }) + + expect(todo.headers?.authorization).toBe('let-me-in') + }) + + it('supports params.connection', async () => { + const connection = { + headers: { + Authorization: 'let-me-in' + } + } + const todo = await service.get('taxes', { + connection, + query: { returnheaders: true } + }) + + expect(todo.headers?.authorization).toBe('let-me-in') + }) + + it('handles errors properly', async () => { + await expect(() => service.get('notfound', {})).rejects.toMatchObject({ + code: 404, + name: 'NotFound', + message: 'Not found' + }) + + await expect(() => service.get('notfound', {})).rejects.toBeInstanceOf(NotFound) + }) + + it('supports nested arrays in queries', async () => { + const query = { test: { $in: ['0', '1', '2'] }, returnquery: 'true' } + const data = await service.get('dishes', { query }) + + expect(data.query).toEqual(query) + }) + + it('can initialize a client instance', async () => { + const init = fetchClient(fetch, { + baseUrl: baseUrl + }) + const todoService = init.service('todos') + + expect(todoService).toBeInstanceOf(init.Service) + + const todos = await todoService.find({}) + + verify.find(todos) + }) + + it('remove many', async () => { + const todo = await service.remove(null) + + expect(todo).toEqual({ id: null }) + }) + + it('converts feathers errors (#50)', async () => { + await expect(() => service.get('notacceptable', {})).rejects.toMatchObject({ + code: 406, + name: 'NotAcceptable', + message: 'This is a Feathers error', + data: { + testData: true + } + }) + + await expect(() => service.get('notacceptable', {})).rejects.toBeInstanceOf(NotAcceptable) + }) + + it('returns null for 204 responses', async () => { + const response = await service.get('nocontent', {}) + expect(response).toBeNull() + }) + + it('works with custom method .customMethod', async () => { + const result = await service.customMethod({ message: 'hi' }, {}) + + expect(result).toEqual({ + data: { message: 'hi' }, + provider: 'rest', + method: 'customMethod' + }) + }) + + it('errors for non existing custom and existing internal method', async () => { + //@ts-expect-error Testing non existent method + await expect(() => service.wrongCustomMethod({})).rejects.toThrow(MethodNotAllowed) + //@ts-expect-error Testing method with parameters + await expect(() => service.internalMethod({})).rejects.toThrow(MethodNotAllowed) + }) + + it('supports async iterable streams', async () => { + const messages: any[] = [] + const stream = await app.service('test').get('test') + + for await (const data of stream) { + messages.push(data) + } + + expect(messages).toHaveLength(5) + expect(messages[0]).toEqual({ message: 'Hello test 1' }) + expect(messages[1]).toEqual({ message: 'Hello test 2' }) + expect(messages[2]).toEqual({ message: 'Hello test 3' }) + expect(messages[3]).toEqual({ message: 'Hello test 4' }) + expect(messages[4]).toEqual({ message: 'Hello test 5' }) + }) + + clientTests(app, 'todos') +}) diff --git a/packages/feathers/src/client/fetch.ts b/packages/feathers/src/client/fetch.ts new file mode 100644 index 0000000000..742ce90810 --- /dev/null +++ b/packages/feathers/src/client/fetch.ts @@ -0,0 +1,301 @@ +import { Params, Id, Query, NullableId } from '../declarations.js' +import { Unavailable, convert, errors } from '../errors.js' +import { _, stripSlashes } from '../commons.js' +import { protectedProperties } from '../service.js' + +function toError(error: Error & { code: string }, status?: number) { + if (error.code === 'ECONNREFUSED') { + return new Unavailable(error.message, _.pick(error, 'address', 'port', 'config')) + } + + return convert(error, status) +} + +export interface FetchClientParams extends Params { + connection?: any +} + +interface FetchClientSettings { + name: string + baseUrl: string + connection: typeof fetch + stringify: (query: Query) => string + events?: string[] +} + +export type RequestOptions = Omit & { url: string; body?: unknown } + +export class FetchClient, P extends Params = FetchClientParams> { + name: string + base: string + connection: typeof fetch + stringify: (query: Query) => string + events?: string[] + + constructor(settings: FetchClientSettings) { + this.name = stripSlashes(settings.name) + this.connection = settings.connection + this.base = `${settings.baseUrl}/${this.name}` + this.stringify = settings.stringify + this.events = settings.events + } + + makeUrl(query: Query, id?: string | number | null, route?: { [key: string]: string }) { + let url = this.base + + if (route) { + Object.keys(route).forEach((key) => { + url = url.replace(`:${key}`, route[key]) + }) + } + + if (typeof id !== 'undefined' && id !== null) { + url += `/${encodeURIComponent(id)}` + } + + return url + this.getQuery(query || {}) + } + + getQuery(query: Query) { + const queryString = this.stringify(query) + + return queryString ? `?${queryString}` : '' + } + + async request(options: RequestOptions, params: FetchClientParams = {}) { + const { url, ...requestInit } = options + const fetchOptions: RequestInit = { + ...requestInit, + ...params.connection + } + + fetchOptions.headers = { + Accept: 'application/json', + ...fetchOptions.headers, + ...params.headers + } + + if (options.body) { + fetchOptions.body = JSON.stringify(options.body) + fetchOptions.headers = { + 'Content-Type': 'application/json', + ...fetchOptions.headers + } + } + + const response = await this.connection(url, fetchOptions) + + await this.checkStatus(response) + + if (response.status === 204) { + return null + } + + if (response.headers.get('content-type') === 'text/event-stream') { + return this.handleEventStream(response) + } + + return response.json() + } + + callCustomMethod(method: string, body: unknown, params: FetchClientParams) { + return this.request( + { + url: this.makeUrl(params?.query, null, params?.route), + method: 'POST', + headers: { + 'X-Service-Method': method + }, + body + }, + params + ) + } + + async *handleEventStream(res: Response) { + const reader = res.body.getReader() + const decoder = new TextDecoder() + + while (true) { + const { value, done } = await reader.read() + + if (done) { + break + } + + if (value) { + const text = decoder.decode(value) + const eventChunks = text.split('\n\n').filter(Boolean) + + for (const chunk of eventChunks) { + const lines = chunk.split('\n') + const dataLine = lines.find((line) => line.startsWith('data: ')) + + if (dataLine) { + yield JSON.parse(dataLine.substring('data: '.length)) + } + } + } + } + } + + async checkStatus(response: Response) { + if (response.ok) { + return response + } + + const ErrorClass = (errors as any)[response.status] || Error + + let error: Error & { response: Response } = new ErrorClass('JSON parsing error') + + try { + const data = await response.json() + + error = await toError(data, response.status) + } catch (_error) {} + + error.response = response + + throw error + } + + _find(params?: P) { + return this.request( + { + url: this.makeUrl(params.query, null, params.route), + method: 'GET', + headers: Object.assign({}, params.headers) + }, + params + ) + } + + find(params?: P) { + return this._find(params) + } + + async _get(id: Id, params?: P) { + if (typeof id === 'undefined') { + throw new Error("id for 'get' can not be undefined") + } + + return this.request( + { + url: this.makeUrl(params.query, id, params.route), + method: 'GET' + }, + params + ) + } + + get(id: Id, params?: P) { + return this._get(id, params) + } + + _create(data: D, params?: P) { + return this.request( + { + url: this.makeUrl(params.query, null, params.route), + body: data, + method: 'POST' + }, + params + ) + } + + create(data: D, params?: P) { + return this._create(data, params) + } + + async _update(id: NullableId, data: D, params?: P) { + if (typeof id === 'undefined') { + throw new Error("id for 'update' can not be undefined, only 'null' when updating multiple entries") + } + + return this.request( + { + url: this.makeUrl(params.query, id, params.route), + body: data, + method: 'PUT' + }, + params + ) + } + + update(id: NullableId, data: D, params?: P) { + return this._update(id, data, params) + } + + async _patch(id: NullableId, data: D, params?: P) { + if (typeof id === 'undefined') { + throw new Error("id for 'patch' can not be undefined, only 'null' when updating multiple entries") + } + + return this.request( + { + url: this.makeUrl(params.query, id, params.route), + body: data, + method: 'PATCH' + }, + params + ) + } + + patch(id: NullableId, data: D, params?: P) { + return this._patch(id, data, params) + } + + async _remove(id: NullableId, params?: P) { + if (typeof id === 'undefined') { + throw new Error("id for 'remove' can not be undefined, only 'null' when removing multiple entries") + } + + return this.request( + { + url: this.makeUrl(params.query, id, params.route), + method: 'DELETE' + }, + params + ) + } + + remove(id: NullableId, params?: P) { + return this._remove(id, params) + } +} + +export class ProxiedFetchClient< + T = any, + D = Partial, + P extends Params = FetchClientParams +> extends FetchClient { + constructor(settings: FetchClientSettings) { + super(settings) + + // Create and return a proxy after construction is complete + const proxy = new Proxy(this, { + get(target, prop, receiver) { + const value = Reflect.get(target, prop, receiver) + if (value !== undefined) { + return value + } + + // Proxy other custom methods + if ( + typeof prop === 'string' && + !prop.startsWith('_') && + !prop.startsWith('Symbol(') && + !protectedProperties.includes(prop) + ) { + return function (data: any, params?: P) { + return target.callCustomMethod(prop, data, params) + } + } + + return undefined + } + }) + + return proxy + } +} diff --git a/packages/feathers/src/client/index.ts b/packages/feathers/src/client/index.ts new file mode 100644 index 0000000000..9f0420cd64 --- /dev/null +++ b/packages/feathers/src/client/index.ts @@ -0,0 +1,44 @@ +import qs from 'qs' +import type { Application, Query } from '../declarations.js' +import { FetchClient, ProxiedFetchClient } from './fetch.js' +import { sseClient, SseClientOptions } from './sse.js' +import { defaultServiceEvents } from '../service.js' + +export * from './fetch.js' +export * from './types.js' +export * from './sse.js' + +export type ClientOptions = { + baseUrl?: string + Service?: typeof FetchClient + stringify?: (query: Query) => string + sse?: string | SseClientOptions +} + +export function fetchClient(connection: typeof fetch, options: ClientOptions = {}) { + const { stringify = qs.stringify, baseUrl = '', Service = ProxiedFetchClient } = options + const events = options.sse ? defaultServiceEvents : undefined + const sseOptions = typeof options.sse === 'string' ? { path: options.sse } : options.sse + const defaultService = function (name: string) { + return new Service({ baseUrl, name, connection, stringify, events }) + } + const initialize = (_app: Application) => { + const app = _app as Application & { rest: typeof fetch } + + if (app.rest !== undefined) { + throw new Error('Only one default client provider can be configured') + } + + app.rest = connection + app.defaultService = defaultService + + if (sseOptions) { + app.configure(sseClient(sseOptions)) + } + } + + initialize.Service = Service + initialize.service = defaultService + + return initialize +} diff --git a/packages/feathers/src/client/sse.test.ts b/packages/feathers/src/client/sse.test.ts new file mode 100644 index 0000000000..db1b3195e4 --- /dev/null +++ b/packages/feathers/src/client/sse.test.ts @@ -0,0 +1,188 @@ +import { beforeAll, afterAll, describe, it, expect } from 'vitest' +import { Application, feathers, Params } from '../index.js' +import { getApp, createTestServer, TestServiceTypes, Todo } from '../../fixtures/index.js' +import { fetchClient, ReconnectingEvent } from './index.js' + +describe('SSE client', function () { + const port = 8890 + const url = `http://localhost:${port}` + + let server: any + let app: Application + let client1: Application + let client2: Application + + beforeAll(async () => { + app = getApp() + app.on('connection', (connection: Params) => { + app.channel('general').join(connection) + + const { channel } = connection.query + + if (channel) { + app.channel(channel).join(connection) + } + }) + app.publish((data: any) => { + if (typeof data.channel !== 'string') { + return app.channel('general') + } else { + return app.channel(data.channel) + } + }) + + server = await createTestServer(port, app) + + client1 = feathers().configure( + fetchClient(fetch, { + baseUrl: url, + sse: 'sse' + }) + ) + client2 = feathers().configure( + fetchClient(fetch, { + baseUrl: url, + sse: 'sse' + }) + ) + }) + + afterAll(async () => { + server.close() + }) + + it('should stream basic SSE between clients, can abort sse', async () => { + const events: Todo[] = [] + + client1.service('sse').emit('start') + + const controller = await new Promise((resolve) => { + client1.service('sse').once('connected', (data: AbortController) => resolve(data)) + }) + + client1.service('todos').on('created', (data: Todo) => { + events.push(data) + }) + + await client2.service('todos').create({ text: 'todo 1', complete: true }) + await Promise.all([ + client2.service('todos').create({ text: 'todo 2', complete: false }), + client2.service('todos').create({ text: 'todo 3', complete: true }), + app.service('todos').create({ text: 'server todo', complete: false }) + ]) + + await new Promise((resolve) => setTimeout(() => resolve(), 50)) + + controller.abort() + + await client2.service('todos').create({ text: 'todo x', complete: true }) + await new Promise((resolve) => setTimeout(() => resolve(), 50)) + + expect(events.length).toBe(4) + }) + + it('emits AbortController on successful connection', async () => { + const params = { + query: { message: 'testing' } + } + + client1.service('sse').emit('start', params) + + const controller = await new Promise((resolve) => { + client1.service('sse').once('connected', (data: AbortController) => resolve(data)) + }) + + controller.abort() + expect(controller.signal.aborted).toBe(true) + }) + + it('only receive events for their channels', async () => { + const events: Todo[] = [] + + client1.service('sse').emit('start', { query: { channel: 'client' } }) + client2.service('sse').emit('start', { query: { channel: 'client' } }) + + await Promise.all([ + new Promise((resolve) => client1.service('sse').once('connected', resolve)), + new Promise((resolve) => client2.service('sse').once('connected', resolve)) + ]) + + client1.service('todos').on('created', (todo: Todo) => events.push(todo)) + client2.service('todos').on('created', (todo: Todo) => events.push(todo)) + + await client2.service('todos').create({ + text: 'todo x', + complete: true, + channel: 'client' + }) + + await new Promise((resolve) => setTimeout(() => resolve(), 50)) + + expect(events.length).toBe(2) + + await client2.service('todos').create({ + text: 'todo x', + complete: true, + channel: 'notclient' + }) + + await new Promise((resolve) => setTimeout(() => resolve(), 50)) + + expect(events.length).toBe(2) + }) + + it('initiates reconnection when server is unavailable', async () => { + const reconnectPort = 8946 + let server = await createTestServer(reconnectPort, app) + const reconnectClient = feathers().configure( + fetchClient(fetch, { + baseUrl: `http://localhost:${reconnectPort}`, + sse: { + path: 'sse', + reconnectionDelay: 50, + reconnectionDelayMax: 500 + } + }) + ) + reconnectClient.service('sse').emit('start') + + await new Promise((resolve) => { + reconnectClient.service('sse').once('connected', (data: AbortController) => resolve(data)) + }) + + const disconnectEvent = new Promise((resolve) => { + reconnectClient.service('sse').once('disconnected', (error: Error) => resolve(error)) + }) + const reconnectingEvents = new Promise((resolve) => { + const retries: ReconnectingEvent[] = [] + + reconnectClient.service('sse').on('reconnecting', (info: ReconnectingEvent) => { + retries.push(info) + if (retries.length === 2) { + resolve(retries) + } + }) + }) + + server.closeAllConnections() + server.close() + + const reconnections = await reconnectingEvents + + expect(reconnections).toHaveLength(2) + expect(reconnections[0]).toHaveProperty('delay') + expect(reconnections[0].attempt).toEqual(1) + expect(reconnections[1].attempt).toEqual(2) + + expect(await disconnectEvent).toBeInstanceOf(Error) + + server = await createTestServer(reconnectPort, app) + + await new Promise((resolve) => { + reconnectClient.service('sse').once('connected', (data: AbortController) => resolve(data)) + }) + + server.closeAllConnections() + server.close() + }) +}) diff --git a/packages/feathers/src/client/sse.ts b/packages/feathers/src/client/sse.ts new file mode 100644 index 0000000000..d166cd134b --- /dev/null +++ b/packages/feathers/src/client/sse.ts @@ -0,0 +1,101 @@ +import { Application, Params } from '../declarations.js' + +export interface SseClientOptions { + path: string + reconnectionDelay?: number + reconnectionDelayMax?: number +} + +export interface ReconnectingEvent { + delay: number + attempt: number + timeout: number | null +} + +function getDelay(attempt: number, reconnectionDelay: number, reconnectionDelayMax: number, jitter = 0.3) { + const baseDelay = Math.min(reconnectionDelay * Math.pow(2, attempt - 1), reconnectionDelayMax) + const jit = (Math.random() - 0.5) * (jitter * 2) + + return Math.round(baseDelay * (1 + jit)) +} + +export function sseClient(options: SseClientOptions) { + return (client: Application) => { + const { path, reconnectionDelay = 1000, reconnectionDelayMax = 5000 } = options + const sseService = client.service(path) + + let attempt = 0 + let timeout: number | null = null + + const reconnect = (params: Params) => { + if (timeout !== null) { + return + } + + const delay = getDelay(++attempt, reconnectionDelay, reconnectionDelayMax) + + timeout = setTimeout(() => { + timeout = null + connect(params) + }, delay) as unknown as number + sseService.emit('reconnecting', { + delay, + attempt, + timeout: timeout + }) + } + + const connect = (params: Params) => { + const abortController = new AbortController() + const sseParams = { + ...params, + connection: { + ...params.connection, + signal: abortController.signal + } + } + + // Do not await the request since the promise won't resolve until an event happens + sseService + .find(sseParams) + .then(async (stream) => { + try { + attempt = 0 + + for await (const payload of stream) { + if (abortController.signal.aborted) { + break + } + + try { + if (payload.path === options.path && payload.event === 'connected') { + sseService.emit('connected', abortController) + } else { + client.service(payload.path).emit(payload.event, payload.data) + } + } catch (error) { + sseService.emit('error', error) + } + } + } catch (error: unknown) { + if ((error as Error).name !== 'AbortError') { + throw error + } + } + }) + .catch((error) => { + abortController.abort() + sseService.emit('disconnected', error) + + if ((error as Error).name !== 'AbortError') { + timeout = null + reconnect(params) + } + }) + } + + sseService.on('start', (params: Params = {}) => { + connect(params) + }) + } +} diff --git a/packages/feathers/src/client/types.ts b/packages/feathers/src/client/types.ts new file mode 100644 index 0000000000..3e1602a4f0 --- /dev/null +++ b/packages/feathers/src/client/types.ts @@ -0,0 +1,39 @@ +// Utility type to pick only the `query` property from Params if it exists +type QueryParams = T extends { query?: infer Q } ? { query?: Q } : never + +// Infer the types of `id`, `data`, and `params` for a given method signature +type MethodParams = T extends (...args: any[]) => any + ? Parameters extends [infer I, infer D, infer P] + ? [I, D, Omit & QueryParams

] | [I, D] + : Parameters extends [infer I, infer P] + ? [I, Omit & QueryParams

] | [I] + : Parameters extends [infer P] + ? [Omit & QueryParams

] | [] + : never + : never + +// Infer the return type of a given method +type MethodReturnType = T extends (...args: any[]) => infer R ? R : any + +// Define a type that represents the methods and their inferred types +export type PublicServiceMethods = { + [K in keyof S]: S[K] extends (...args: any[]) => Promise + ? (...args: MethodParams) => MethodReturnType + : never +} + +type ConditionalPick = { + [Key in keyof Base]: Key extends Condition ? Base[Key] : never +} + +type NonNeverKeys = { + [Key in keyof T]: T[Key] extends never ? never : Key +}[keyof T] + +type ConditionalPublicMethods = Pick>> + +type DefaultMethodNames = 'create' | 'find' | 'get' | 'update' | 'remove' | 'patch' + +export type ClientServices = { + [K in keyof ST]: ConditionalPublicMethods, DefaultMethodNames> +} diff --git a/packages/commons/test/utils.test.ts b/packages/feathers/src/commons.test.ts similarity index 98% rename from packages/commons/test/utils.test.ts rename to packages/feathers/src/commons.test.ts index 53d51978ab..424d82f08b 100644 --- a/packages/commons/test/utils.test.ts +++ b/packages/feathers/src/commons.test.ts @@ -1,8 +1,9 @@ /* tslint:disable:no-unused-expression */ +import { describe, it } from 'vitest' import { strict as assert } from 'assert' -import { _, stripSlashes, isPromise, createSymbol } from '../src' +import { _, stripSlashes, isPromise, createSymbol } from '../src/commons.js' -describe('@feathersjs/commons utils', () => { +describe('feathers/commons utils', () => { it('stripSlashes', () => { assert.equal(stripSlashes('some/thing'), 'some/thing') assert.equal(stripSlashes('/some/thing'), 'some/thing') diff --git a/packages/commons/src/index.ts b/packages/feathers/src/commons.ts similarity index 98% rename from packages/commons/src/index.ts rename to packages/feathers/src/commons.ts index 9455252384..a6d06cbdaf 100644 --- a/packages/commons/src/index.ts +++ b/packages/feathers/src/commons.ts @@ -99,4 +99,4 @@ export function createSymbol(name: string) { return typeof Symbol !== 'undefined' ? Symbol.for(name) : name } -export * from './debug' +export * from './debug.js' diff --git a/packages/commons/test/debug.test.ts b/packages/feathers/src/debug.test.ts similarity index 87% rename from packages/commons/test/debug.test.ts rename to packages/feathers/src/debug.test.ts index 2089af9b0c..8e0da19a52 100644 --- a/packages/commons/test/debug.test.ts +++ b/packages/feathers/src/debug.test.ts @@ -1,5 +1,6 @@ +import { describe, it } from 'vitest' import { strict as assert } from 'assert' -import { createDebug, setDebug, noopDebug } from '../src' +import { createDebug, setDebug, noopDebug } from '../src/debug.js' const myDebug = createDebug('hello test') diff --git a/packages/commons/src/debug.ts b/packages/feathers/src/debug.ts similarity index 91% rename from packages/commons/src/debug.ts rename to packages/feathers/src/debug.ts index 5c15e62cf7..1922c03ee4 100644 --- a/packages/commons/src/debug.ts +++ b/packages/feathers/src/debug.ts @@ -1,4 +1,3 @@ -/* eslint-disable @typescript-eslint/no-empty-function */ export type DebugFunction = (...args: any[]) => void export type DebugInitializer = (name: string) => DebugFunction diff --git a/packages/feathers/test/declarations.test.ts b/packages/feathers/src/declarations.test.ts similarity index 94% rename from packages/feathers/test/declarations.test.ts rename to packages/feathers/src/declarations.test.ts index 1ee2389dc7..e917249847 100644 --- a/packages/feathers/test/declarations.test.ts +++ b/packages/feathers/src/declarations.test.ts @@ -1,6 +1,7 @@ +import { describe, it } from 'vitest' import assert from 'assert' -import { hooks } from '@feathersjs/hooks' -import { feathers, ServiceInterface, Application, HookContext, NextFunction } from '../src' +import { hooks } from '../src/hooks/index.js' +import { feathers, ServiceInterface, Application, HookContext, NextFunction } from '../src/index.js' interface Todo { id: number diff --git a/packages/feathers/src/declarations.ts b/packages/feathers/src/declarations.ts index aece46eebd..1d09404a45 100644 --- a/packages/feathers/src/declarations.ts +++ b/packages/feathers/src/declarations.ts @@ -1,5 +1,6 @@ import { EventEmitter } from 'events' -import { NextFunction, HookContext as BaseHookContext } from '@feathersjs/hooks' +import type { Router } from './router.js' +import { NextFunction, HookContext as BaseHookContext } from './hooks/index.js' type SelfOrArray = S | S[] type OptionalPick = Pick> @@ -138,6 +139,12 @@ export type ServiceInterface< export interface ServiceAddons extends EventEmitter { id?: string hooks(options: HookOptions): this + + 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 } export interface ServiceHookOverloads { @@ -196,6 +203,11 @@ export type ServiceGenericType = S extends ServiceInterface ? T : an export type ServiceGenericData = S extends ServiceInterface ? D : any export type ServiceGenericParams = S extends ServiceInterface ? P : any +export interface RouteLookup { + service: Service + params: { [key: string]: any } +} + export interface FeathersApplication { /** * The Feathers application version @@ -226,6 +238,19 @@ export interface FeathersApplication { */ _isSetup: boolean + /** + * The application routing mechanism + */ + routes: Router<{ + service: Service + params?: { [key: string]: any } + }> + + /** + * Lookup a route by path + */ + lookup(path: string): RouteLookup + /** * Retrieve an application setting by name * @@ -319,7 +344,18 @@ export interface FeathersApplication { // so that the declaration can be extended by other modules export interface Application extends FeathersApplication, - EventEmitter {} + EventEmitter { + 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 +} export type Id = number | string export type NullableId = Id | null @@ -333,6 +369,7 @@ export interface Params { provider?: string route?: { [key: string]: any } headers?: { [key: string]: any } + connection?: RealTimeConnection } export interface PaginationOptions { @@ -493,3 +530,20 @@ export type ApplicationHookMap = { } export type ApplicationHookOptions = HookOptions | ApplicationHookMap + +// Channel types +export type Event = string | symbol +export type Publisher = ( + data: T, + context: HookContext +) => Channel | Channel[] | void | Promise + +export interface Channel { + connections: RealTimeConnection[] + data: any + length: number + leave(...connections: RealTimeConnection[]): this + join(...connections: RealTimeConnection[]): this + filter(fn: (connection: RealTimeConnection) => boolean): Channel + send(data: any): Channel +} diff --git a/packages/errors/test/index.test.ts b/packages/feathers/src/errors.test.ts similarity index 98% rename from packages/errors/test/index.test.ts rename to packages/feathers/src/errors.test.ts index e4a0263108..30607e81c0 100644 --- a/packages/errors/test/index.test.ts +++ b/packages/feathers/src/errors.test.ts @@ -1,5 +1,6 @@ +import { describe, it } from 'vitest' import assert from 'assert' -import * as errors from '../src' +import * as errors from '../src/errors.js' const { convert } = errors @@ -358,7 +359,7 @@ describe('@feathersjs/errors', () => { assert.strictEqual(e.stack.indexOf(text), 0) - assert.ok(e.stack.indexOf('index.test.ts') !== -1) + assert.ok(e.stack.indexOf('errors.test.ts') !== -1) const oldCST = Error.captureStackTrace diff --git a/packages/errors/src/index.ts b/packages/feathers/src/errors.ts similarity index 98% rename from packages/errors/src/index.ts rename to packages/feathers/src/errors.ts index cca8761fd3..8a0dacc484 100644 --- a/packages/errors/src/index.ts +++ b/packages/feathers/src/errors.ts @@ -255,12 +255,12 @@ export const errors = { 503: Unavailable } -export function convert(error: any) { +export function convert(error: any, status?: number) { if (!error) { return error } - const FeathersError = (errors as any)[error.name] + const FeathersError = (errors as any)[status || error.name] const result = FeathersError ? new FeathersError(error.message, error.data) : new Error(error.message || error) diff --git a/packages/feathers/test/events.test.ts b/packages/feathers/src/events.test.ts similarity index 69% rename from packages/feathers/test/events.test.ts rename to packages/feathers/src/events.test.ts index 58e6b7f245..ef4fd333d0 100644 --- a/packages/feathers/test/events.test.ts +++ b/packages/feathers/src/events.test.ts @@ -1,22 +1,25 @@ +import { describe, it } from 'vitest' 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) => { + it('app is an event emitter', async () => { const app = feathers() assert.strictEqual(typeof app.on, 'function') - app.on('test', (data: any) => { - assert.deepStrictEqual(data, { message: 'app' }) - done() + await new Promise((resolve) => { + app.on('test', (data: any) => { + assert.deepStrictEqual(data, { message: 'app' }) + resolve() + }) + app.emit('test', { message: 'app' }) }) - app.emit('test', { message: 'app' }) }) - it('works with service that is already an EventEmitter', (done) => { + it('works with service that is already an EventEmitter', async () => { const app = feathers() const service: any = new EventEmitter() @@ -24,22 +27,26 @@ describe('Service events', () => { return data } - service.on('created', (data: any) => { - assert.deepStrictEqual(data, { - message: 'testing' + const promise = new Promise((resolve) => { + service.on('created', (data: any) => { + assert.deepStrictEqual(data, { + message: 'testing' + }) + resolve() }) - done() }) app.use('/emitter', service) - app.service('emitter').create({ + await app.service('emitter').create({ message: 'testing' }) + + await promise }) describe('emits event data on a service', () => { - it('.create and created', (done) => { + it('.create and created', async () => { const app = feathers().use('/creator', { async create(data: any) { return data @@ -48,15 +55,18 @@ describe('Service events', () => { const service = app.service('creator') - service.on('created', (data: any) => { - assert.deepStrictEqual(data, { message: 'Hello' }) - done() + const promise = new Promise((resolve) => { + service.on('created', (data: any) => { + assert.deepStrictEqual(data, { message: 'Hello' }) + resolve() + }) }) - service.create({ message: 'Hello' }) + await service.create({ message: 'Hello' }) + await promise }) - it('allows to skip event emitting', (done) => { + it('allows to skip event emitting', async () => { const app = feathers().use('/creator', { async create(data: any) { return data @@ -69,20 +79,21 @@ describe('Service events', () => { before: { create(context: any) { context.event = null - return context } } }) + let eventFired = false service.on('created', () => { - done(new Error('Should never get here')) + eventFired = true }) - service.create({ message: 'Hello' }).then(() => done()) + await service.create({ message: 'Hello' }) + assert.strictEqual(eventFired, false) }) - it('.update and updated', (done) => { + it('.update and updated', async () => { const app = feathers().use('/creator', { async update(id: any, data: any) { return Object.assign({ id }, data) @@ -91,15 +102,18 @@ describe('Service events', () => { const service = app.service('creator') - service.on('updated', (data: any) => { - assert.deepStrictEqual(data, { id: 10, message: 'Hello' }) - done() + const promise = new Promise((resolve) => { + service.on('updated', (data: any) => { + assert.deepStrictEqual(data, { id: 10, message: 'Hello' }) + resolve() + }) }) - service.update(10, { message: 'Hello' }) + await service.update(10, { message: 'Hello' }) + await promise }) - it('.patch and patched', (done) => { + it('.patch and patched', async () => { const app = feathers().use('/creator', { async patch(id: any, data: any) { return Object.assign({ id }, data) @@ -108,15 +122,18 @@ describe('Service events', () => { const service = app.service('creator') - service.on('patched', (data: any) => { - assert.deepStrictEqual(data, { id: 12, message: 'Hello' }) - done() + const promise = new Promise((resolve) => { + service.on('patched', (data: any) => { + assert.deepStrictEqual(data, { id: 12, message: 'Hello' }) + resolve() + }) }) - service.patch(12, { message: 'Hello' }) + await service.patch(12, { message: 'Hello' }) + await promise }) - it('.remove and removed', (done) => { + it('.remove and removed', async () => { const app = feathers().use('/creator', { async remove(id: any) { return { id } @@ -125,12 +142,15 @@ describe('Service events', () => { const service = app.service('creator') - service.on('removed', (data: any) => { - assert.deepStrictEqual(data, { id: 22 }) - done() + const promise = new Promise((resolve) => { + service.on('removed', (data: any) => { + assert.deepStrictEqual(data, { id: 22 }) + resolve() + }) }) - service.remove(22) + await service.remove(22) + await promise }) }) @@ -268,7 +288,7 @@ describe('Service events', () => { }) describe('event format', () => { - it('also emits the actual hook object', (done) => { + it('also emits the actual hook object', async () => { const app = feathers().use('/creator', { async create(data: any) { return data @@ -279,27 +299,27 @@ describe('Service events', () => { service.hooks({ after(hook: any) { - hook.changed = true + hook.number = 42 } }) - service.on('created', (data: any, hook: any) => { - try { - assert.deepStrictEqual(data, { message: 'Hi' }) - assert.ok(hook.changed) - assert.strictEqual(hook.service, service) - assert.strictEqual(hook.method, 'create') - assert.strictEqual(hook.type, 'around') - done() - } catch (error: any) { - done(error) - } + const promise = new Promise((resolve, reject) => { + service.on('created', (data: any, hook: any) => { + try { + assert.deepStrictEqual(data, { message: 'Hi' }) + assert.strictEqual(hook.number, 42) + resolve() + } catch (error: any) { + reject(error) + } + }) }) - service.create({ message: 'Hi' }) + await service.create({ message: 'Hi' }) + await promise }) - it('events indicated by the service are not sent automatically', (done) => { + it('events indicated by the service are not sent automatically', async () => { class Creator { events = ['created'] async create(data: any) { @@ -309,13 +329,16 @@ describe('Service events', () => { const app = feathers().use('/creator', new Creator()) const service = app.service('creator') - service.on('created', (data: any) => { - assert.deepStrictEqual(data, { message: 'custom event' }) - done() + const promise = new Promise((resolve) => { + service.on('created', (data: any) => { + assert.deepStrictEqual(data, { message: 'custom event' }) + resolve() + }) }) - service.create({ message: 'hello' }) + await service.create({ message: 'hello' }) service.emit('created', { message: 'custom event' }) + await promise }) }) }) diff --git a/packages/feathers/src/events.ts b/packages/feathers/src/events.ts index 50956f829d..02b0f28c58 100644 --- a/packages/feathers/src/events.ts +++ b/packages/feathers/src/events.ts @@ -1,23 +1,23 @@ import { EventEmitter } from 'events' -import { NextFunction } from '@feathersjs/hooks' -import { HookContext, FeathersService } from './declarations' -import { getServiceOptions, defaultEventMap } from './service' +import { NextFunction } from './hooks/index.js' +import { HookContext, FeathersService } from './declarations.js' +import { getServiceOptions, defaultEventMap } from './service.js' -export function eventHook(context: HookContext, next: NextFunction) { +export async 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] + await next() - results.forEach((element) => (context as any).self.emit(context.event, element, context)) - } - }) + // 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) { diff --git a/packages/feathers/src/hooks.ts b/packages/feathers/src/hooks.ts index 758ab33251..b19495ca3e 100644 --- a/packages/feathers/src/hooks.ts +++ b/packages/feathers/src/hooks.ts @@ -6,7 +6,7 @@ import { hooks, Middleware, collect -} from '@feathersjs/hooks' +} from './hooks/index.js' import { Service, ServiceOptions, @@ -16,8 +16,8 @@ import { AroundHookFunction, HookFunction, HookType -} from './declarations' -import { defaultServiceArguments, getHookMethods } from './service' +} from './declarations.js' +import { defaultServiceArguments, getHookMethods } from './service.js' type ConvertedMap = { [type in HookType]: ReturnType } diff --git a/packages/feathers/src/hooks/base.ts b/packages/feathers/src/hooks/base.ts new file mode 100644 index 0000000000..7e68f8a526 --- /dev/null +++ b/packages/feathers/src/hooks/base.ts @@ -0,0 +1,230 @@ +import { AsyncMiddleware } from './compose.js' +import { copyProperties } from './utils.js' + +export const HOOKS: string = Symbol.for('@feathersjs/hooks') as any + +export type HookContextData = { [key: string]: any } + +/** + * The base hook context. + */ +export class BaseHookContext { + self?: C; + [key: string]: any + + constructor(data: HookContextData = {}) { + Object.assign(this, data) + } + + toJSON() { + const keys = Object.keys(this) + let proto = Object.getPrototypeOf(this) + + while (proto) { + keys.push(...Object.keys(proto)) + proto = Object.getPrototypeOf(proto) + } + + return keys.reduce( + (result, key) => { + result[key] = this[key] + + return result + }, + {} as Record + ) + } +} + +export interface HookContext extends BaseHookContext { + result?: T + method?: string + arguments: any[] +} + +export type HookContextConstructor = new (data?: { [key: string]: any }) => BaseHookContext + +export type HookDefaultsInitializer = (self?: any, args?: any[], context?: HookContext) => HookContextData + +export class HookManager { + _parent?: this | null = null + _params: string[] | null = null + _middleware: AsyncMiddleware[] | null = null + _props: HookContextData | null = null + _defaults?: HookDefaultsInitializer + + parent(parent: this | null) { + this._parent = parent + + return this + } + + middleware(middleware?: AsyncMiddleware[]) { + this._middleware = middleware?.length ? middleware : null + + return this + } + + getMiddleware(): AsyncMiddleware[] | null { + const previous = this._parent?.getMiddleware() + + if (previous && this._middleware) { + return previous.concat(this._middleware) + } + + return previous || this._middleware + } + + collectMiddleware(self: any, _args: any[]): AsyncMiddleware[] { + const otherMiddleware = getMiddleware(self) + const middleware = this.getMiddleware() + + if (otherMiddleware && middleware) { + return otherMiddleware.concat(middleware) + } + + return otherMiddleware || middleware || [] + } + + props(props: HookContextData) { + if (!this._props) { + this._props = {} + } + + copyProperties(this._props, props) + + return this + } + + getProps(): HookContextData | null { + const previous = this._parent?.getProps() + + if (previous && this._props) { + return copyProperties({}, previous, this._props) + } + + return previous || this._props || null + } + + params(...params: string[]) { + this._params = params + + return this + } + + getParams(): string[] | null { + const previous = this._parent?.getParams() + + if (previous && this._params) { + return previous.concat(this._params) + } + + return previous || this._params + } + + defaults(defaults: HookDefaultsInitializer) { + this._defaults = defaults + + return this + } + + getDefaults(self: any, args: any[], context: HookContext): HookContextData | null { + const defaults = typeof this._defaults === 'function' ? this._defaults(self, args, context) : null + const previous = this._parent?.getDefaults(self, args, context) + + if (previous && defaults) { + return Object.assign({}, previous, defaults) + } + + return previous || defaults + } + + getContextClass(Base: HookContextConstructor = BaseHookContext): HookContextConstructor { + const ContextClass = class ContextClass extends Base { + constructor(data: any) { + super(data) + } + } + const params = this.getParams() + const props = this.getProps() + + if (params) { + params.forEach((name, index) => { + if (props?.[name] !== undefined) { + throw new Error(`Hooks can not have a property and param named '${name}'. Use .defaults instead.`) + } + + Object.defineProperty(ContextClass.prototype, name, { + enumerable: true, + get() { + return this?.arguments[index] + }, + set(value: any) { + this.arguments[index] = value + } + }) + }) + } + + if (props) { + copyProperties(ContextClass.prototype, props) + } + + return ContextClass + } + + initializeContext(self: any, args: any[], context: HookContext): HookContext { + const ctx = this._parent ? this._parent.initializeContext(self, args, context) : context + const defaults = this.getDefaults(self, args, ctx) + + if (self) { + ctx.self = self + } + + ctx.arguments = args + + if (defaults) { + for (const name of Object.keys(defaults)) { + if (ctx[name] === undefined) { + ctx[name] = defaults[name] + } + } + } + + return ctx + } +} + +export type HookOptions = HookManager | AsyncMiddleware[] | null + +export function convertOptions(options: HookOptions = null) { + if (!options) { + return new HookManager() + } + + return Array.isArray(options) ? new HookManager().middleware(options) : options +} + +export function getManager(target: any): HookManager | null { + return (target && target[HOOKS]) || null +} + +export function setManager(target: T, manager: HookManager) { + const parent = getManager(target) + + ;(target as any)[HOOKS] = manager.parent(parent) + + return target +} + +export function getMiddleware(target: any): AsyncMiddleware[] | null { + const manager = getManager(target) + + return manager ? manager.getMiddleware() : null +} + +export function setMiddleware(target: T, middleware: AsyncMiddleware[]) { + const manager = new HookManager().middleware(middleware) + + return setManager(target, manager) +} diff --git a/packages/feathers/src/hooks/benchmark.test.ts b/packages/feathers/src/hooks/benchmark.test.ts new file mode 100644 index 0000000000..b7751266f7 --- /dev/null +++ b/packages/feathers/src/hooks/benchmark.test.ts @@ -0,0 +1,64 @@ +import { describe, it } from 'vitest' +import assert from 'assert' +import { HookContext, hooks, middleware, NextFunction } from './index.js' + +const CYCLES = 100000 +const getRuntime = async (callback: () => Promise) => { + const start = Date.now() + + for (let i = 0; i < CYCLES; i++) { + await callback() + } + + return Date.now() - start +} + +const hello = async (name: string, _params: any = {}) => { + return `Hello ${name}` +} +let baseline: number +let threshold: number +;(async () => { + baseline = await getRuntime(() => hello('Dave')) + threshold = baseline * 15 +})() + +describe('feathers/hooks benchmark', () => { + it('empty hook', async () => { + const hookHello1 = hooks(hello, middleware([])) + const runtime = await getRuntime(() => hookHello1('Dave')) + + assert(runtime < threshold, `Runtime is ${runtime}ms, threshold is ${threshold}ms`) + }) + + it('single simple hook', async () => { + const hookHello = hooks( + hello, + middleware([ + async (_ctx: HookContext, next: NextFunction) => { + await next() + } + ]) + ) + const runtime = await getRuntime(() => hookHello('Dave')) + + assert(runtime < threshold, `Runtime is ${runtime}ms, threshold is ${threshold}ms`) + }) + + it('single hook, withParams and props', async () => { + const hookHello = hooks( + hello, + middleware([ + async (_ctx: HookContext, next: NextFunction) => { + await next() + } + ]) + .params('name') + .props({ dave: true }) + ) + + const runtime = await getRuntime(() => hookHello('Dave')) + + assert(runtime < threshold, `Runtime is ${runtime}ms, threshold is ${threshold}ms`) + }) +}) diff --git a/packages/feathers/src/hooks/class.test.ts b/packages/feathers/src/hooks/class.test.ts new file mode 100644 index 0000000000..8369ec26c8 --- /dev/null +++ b/packages/feathers/src/hooks/class.test.ts @@ -0,0 +1,155 @@ +import { describe, it } from 'vitest' +import assert from 'assert' +import { HookContext, hooks, middleware, NextFunction } from './index.js' + +interface Dummy { + sayHi(name: string): Promise + addOne(number: number): Promise +} + +const createDummyClass = () => { + return class DummyClass implements Dummy { + sayHi(name: string) { + return Promise.resolve(`Hi ${name}`) + } + + addOne(number: number) { + return Promise.resolve(number + 1) + } + } +} + +describe('feathers/hooks classes', () => { + it('hooking object on class adds to the prototype', async () => { + const DummyClass = createDummyClass() + + hooks(DummyClass, { + sayHi: middleware([ + async (ctx: HookContext, next: NextFunction) => { + assert.deepEqual( + { + arguments: ['David'], + method: 'sayHi', + name: 'David', + self: instance + }, + ctx.toJSON() + ) + + await next() + + ctx.result += '?' + } + ]).params('name'), + + addOne: middleware([ + async (ctx: HookContext, next: NextFunction) => { + ctx.arguments[0] += 1 + + await next() + } + ]) + }) + + const instance = new DummyClass() + + assert.equal(await instance.sayHi('David'), 'Hi David?') + assert.equal(await instance.addOne(1), 3) + }) + + it('hooking object works on function that has property', async () => { + const app = function () {} + + app.sayHi = (name: string) => `Hello ${name}` + + hooks(app as any, { + sayHi: middleware([ + async (ctx: HookContext, next: NextFunction) => { + await next() + + ctx.result += '?' + } + ]).params('name') + }) + + assert.equal(await app.sayHi('David'), 'Hello David?') + }) + + it('works with inheritance', async () => { + const DummyClass = createDummyClass() + + const first = async (ctx: HookContext, next: NextFunction) => { + assert.deepEqual(ctx.arguments, ['David']) + assert.equal(ctx.method, 'sayHi') + assert.equal(ctx.self, instance) + + await next() + + ctx.result += '?' + } + const second = async (ctx: HookContext, next: NextFunction) => { + await next() + + ctx.result += '!' + } + + hooks(DummyClass, { + sayHi: middleware([first]) + }) + + class OtherDummy extends DummyClass {} + + hooks(OtherDummy, { + sayHi: middleware([second]) + }) + + const instance = new OtherDummy() + + assert.strictEqual(await instance.sayHi('David'), 'Hi David!?') + }) + + it('works with multiple context updaters', async () => { + const DummyClass = createDummyClass() + + hooks(DummyClass, { + sayHi: middleware([ + async (ctx, next) => { + assert.equal(ctx.name, 'Dave') + + ctx.name = 'Changed' + + await next() + } + ]).params('name') + }) + + class OtherDummy extends DummyClass {} + + hooks(OtherDummy, { + sayHi: middleware([ + async (ctx, next) => { + assert.equal(ctx.name, 'Changed') + assert.equal(ctx.gna, 42) + + await next() + } + ]).props({ gna: 42 }) + }) + + const instance = new OtherDummy() + + hooks(instance, { + sayHi: middleware([ + async (ctx, next) => { + assert.equal(ctx.name, 'Changed') + assert.equal(ctx.gna, 42) + assert.equal(ctx.app, 'ok') + + await next() + } + ]).props({ app: 'ok' }) + }) + + assert.equal(await instance.sayHi('Dave'), 'Hi Changed') + }) +}) diff --git a/packages/feathers/src/hooks/collect.test.ts b/packages/feathers/src/hooks/collect.test.ts new file mode 100644 index 0000000000..ba1bf71644 --- /dev/null +++ b/packages/feathers/src/hooks/collect.test.ts @@ -0,0 +1,136 @@ +import { describe, it, expect } from 'vitest' +import assert from 'assert' +import { collect, HookContext, hooks, middleware, NextFunction } from './index.js' + +describe('feathers/hooks collect', () => { + it('collect: hooks run in order', async () => { + class DummyClass { + async create(data: any) { + data.id = 1 + return data + } + } + hooks(DummyClass, { + create: middleware([ + collect({ + before: [ + (ctx: any) => { + ctx.data.log.push('collect-1 : before : 1') + }, + (ctx: any) => { + ctx.data.log.push('collect-1 : before : 2') + } + ], + after: [ + (ctx: any) => { + ctx.data.log.push('collect-1 : after : 1') + }, + (ctx: any) => { + ctx.data.log.push('collect-1 : after : 2') + } + ], + error: [] + }), + async (ctx: HookContext, next: NextFunction) => { + ctx.data.log.push('async : before') + await next() + ctx.data.log.push('async : after') + }, + collect({ + before: [ + (ctx: any) => { + ctx.data.log.push('collect-2 : before : 3') + }, + (ctx: any) => { + ctx.data.log.push('collect-2 : before : 4') + } + ], + after: [ + (ctx: any) => { + ctx.data.log.push('collect-2 : after : 3') + }, + (ctx: any) => { + ctx.data.log.push('collect-2 : after : 4') + } + ], + error: [] + }) + ]).params('data') + }) + + const service = new DummyClass() + const value = await service.create({ name: 'David', log: [] }) + + assert.deepEqual(value.log, [ + 'collect-1 : before : 1', + 'collect-1 : before : 2', + 'async : before', + 'collect-2 : before : 3', + 'collect-2 : before : 4', + 'collect-2 : after : 3', + 'collect-2 : after : 4', + 'async : after', + 'collect-1 : after : 1', + 'collect-1 : after : 2' + ]) + }) + + it('collect: error hooks', async () => { + class DummyClass { + async create(name: string) { + if (name !== 'after') { + throw new Error(`Error in method with ${name}`) + } + } + } + + const collection = collect({ + before: [ + (ctx) => { + if (ctx.arguments[0] === 'before') { + throw new Error('in before hook') + } + } + ], + after: [ + (ctx) => { + if (ctx.arguments[0] === 'after') { + throw new Error('in after hook') + } + } + ], + error: [ + (ctx) => { + if (ctx.arguments[0] === 'error') { + throw new Error('in error hook') + } + + if (ctx.arguments[0] === 'result') { + ctx.result = 'result from error hook' + } + }, + (ctx) => { + if (ctx.result === 'result from error hook') { + ctx.result += '!' + } + } + ] + }) + + hooks(DummyClass, { + create: middleware([collection]).params('data') + }) + + const service = new DummyClass() + + await expect(service.create('test')).rejects.toThrow('Error in method with test') + + await expect(service.create('before')).rejects.toThrow('in before hook') + + await expect(service.create('after')).rejects.toThrow('in after hook') + + await expect(service.create('error')).rejects.toThrow('in error hook') + + assert.equal(await service.create('result'), 'result from error hook!' as unknown) + }) +}) diff --git a/packages/feathers/src/hooks/compose.test.ts b/packages/feathers/src/hooks/compose.test.ts new file mode 100644 index 0000000000..58768433fc --- /dev/null +++ b/packages/feathers/src/hooks/compose.test.ts @@ -0,0 +1,341 @@ +// Adapted from koa-compose (https://github.com/koajs/compose) +import { describe, expect, it } from 'vitest' +import assert from 'assert' +import { compose, NextFunction } from './index.js' + +function wait(ms: number) { + return new Promise((resolve) => setTimeout(resolve, ms || 1)) +} + +function isPromise(x: any) { + return x && typeof x.then === 'function' +} + +describe('feathers/hooks compose', () => { + it('compose: should work', async () => { + const arr: number[] = [] + const stack = [] + + stack.push(async (_context: any, next: NextFunction) => { + arr.push(1) + await wait(1) + await next() + await wait(1) + arr.push(6) + }) + + stack.push(async (_context: any, next: NextFunction) => { + arr.push(2) + await wait(1) + await next() + await wait(1) + arr.push(5) + }) + + stack.push(async (_context: any, next: NextFunction) => { + arr.push(3) + await wait(1) + await next() + await wait(1) + arr.push(4) + }) + + await compose(stack)({}) + + assert.deepEqual(arr, [1, 2, 3, 4, 5, 6]) + }) + + it('compose: should be able to be called twice', () => { + const stack = [] + + stack.push(async (context: any, next: NextFunction) => { + context.arr.push(1) + await wait(1) + await next() + await wait(1) + context.arr.push(6) + }) + + stack.push(async (context: any, next: NextFunction) => { + context.arr.push(2) + await wait(1) + await next() + await wait(1) + context.arr.push(5) + }) + + stack.push(async (context: any, next: NextFunction) => { + context.arr.push(3) + await wait(1) + await next() + await wait(1) + context.arr.push(4) + }) + + const fn = compose(stack) + const ctx1: any = { arr: [] } + const ctx2: any = { arr: [] } + const out = [1, 2, 3, 4, 5, 6] + + return fn(ctx1) + .then(() => { + assert.deepEqual(out, ctx1.arr) + return fn(ctx2) + }) + .then(() => { + assert.deepEqual(out, ctx2.arr) + }) + }) + + it('compose: should only accept an array', async () => { + // @ts-expect-error test without args + await expect(() => compose()).toThrow('Middleware stack must be an array!') + }) + + it('compose: should create next functions that return a Promise', function () { + const stack = [] + const arr: any = [] + for (let i = 0; i < 5; i++) { + stack.push(async (_context: any, next: NextFunction) => { + arr.push(next()) + }) + } + + compose(stack)({}) + + for (const next of arr) { + assert(isPromise(next), 'one of the functions next is not a Promise') + } + }) + + it('compose: should work with 0 middleware', function () { + return compose([])({}) + }) + + it('compose: should only accept middleware as functions', () => { + expect(() => compose([{}] as any)).toThrow('Middleware must be composed of functions!') + }) + + it('compose: should work when yielding at the end of the stack', async () => { + const stack = [] + let called = false + + stack.push(async (_ctx: any, next: NextFunction) => { + await next() + called = true + }) + + await compose(stack)({}) + assert(called) + }) + + it('compose: should reject on errors in middleware', () => { + const stack = [] + + stack.push(() => { + throw new Error() + }) + + return compose(stack)({}) + .then(function () { + throw new Error('promise was not rejected') + }) + .catch(function (e) { + assert(e instanceof Error) + }) + }) + + it('compose: should keep the context', () => { + const ctx = {} + + const stack = [] + + stack.push(async (ctx2: any, next: NextFunction) => { + await next() + assert.equal(ctx2, ctx) + }) + + stack.push(async (ctx2: any, next: NextFunction) => { + await next() + assert.equal(ctx2, ctx) + }) + + stack.push(async (ctx2: any, next: NextFunction) => { + await next() + assert.equal(ctx2, ctx) + }) + + return compose(stack)(ctx) + }) + + it('compose: should catch downstream errors', async () => { + const arr: number[] = [] + const stack = [] + + stack.push(async (_ctx: any, next: NextFunction) => { + arr.push(1) + try { + arr.push(6) + await next() + arr.push(7) + } catch (_err) { + arr.push(2) + } + arr.push(3) + }) + + stack.push(async (_ctx: any, _next: NextFunction) => { + arr.push(4) + throw new Error() + }) + + await compose(stack)({}) + assert.deepEqual(arr, [1, 6, 4, 2, 3]) + }) + + it('compose: should compose w/ next', () => { + let called = false + + return compose([])({}, async () => { + called = true + }).then(function () { + assert(called) + }) + }) + + it('compose: should handle errors in wrapped non-async functions', () => { + const stack = [] + + stack.push(function () { + throw new Error() + }) + + return compose(stack)({}) + .then(function () { + throw new Error('promise was not rejected') + }) + .catch(function (e) { + assert(e instanceof Error) + }) + }) + + // https://github.com/koajs/compose/pull/27#issuecomment-143109739 + it('compose: should compose w/ other compositions', () => { + const called: number[] = [] + + return compose([ + compose([ + (_ctx, next) => { + called.push(1) + return next() + }, + (_ctx, next) => { + called.push(2) + return next() + } + ]), + (_ctx, next) => { + called.push(3) + return next() + } + ])({}).then(() => assert.deepEqual(called, [1, 2, 3])) + }) + + it('compose: should throw if next() is called multiple times', () => { + return compose([ + async (_ctx, next) => { + await next() + await next() + } + ])({}).then( + () => { + throw new Error('boom') + }, + (err) => { + assert(/multiple times/.test(err.message)) + } + ) + }) + + it('compose: should return a valid middleware', () => { + let val = 0 + return compose([ + compose([ + (_ctx, next) => { + val++ + return next() + }, + (_ctx, next) => { + val++ + return next() + } + ]), + (_ctx, next) => { + val++ + return next() + } + ])({}).then(function () { + assert.strictEqual(val, 3) + }) + }) + + it('compose: should return last return value', () => { + const stack = [] + + stack.push(async (_context: any, next: NextFunction) => { + const val = await next() + assert.equal(val, 2) + return 1 + }) + + stack.push(async (_context: any, next: NextFunction) => { + const val = await next() + assert.equal(val, 0) + return 2 + }) + + const next = async () => 0 + + return compose(stack)({}, next).then(function (val) { + assert.equal(val, 1) + }) + }) + + it('compose: should not affect the original middleware array', () => { + const middleware = [] + const fn1 = (_ctx: any, next: NextFunction) => { + return next() + } + middleware.push(fn1) + + for (const fn of middleware) { + assert.strictEqual(fn, fn1) + } + + compose(middleware) + + for (const fn of middleware) { + assert.strictEqual(fn, fn1) + } + }) + + it('compose: should not get stuck on the passed in next', () => { + const middleware = [ + (_ctx: any, next: NextFunction) => { + ctx.middleware++ + return next() + } + ] + const ctx = { + middleware: 0, + next: 0 + } + + return compose(middleware)(ctx, async (ctx: any, next: NextFunction) => { + ctx.next++ + return next() + }).then(() => { + assert.deepEqual(ctx, { middleware: 1, next: 1 }) + }) + }) +}) diff --git a/packages/feathers/src/hooks/compose.ts b/packages/feathers/src/hooks/compose.ts new file mode 100644 index 0000000000..e5f4a48323 --- /dev/null +++ b/packages/feathers/src/hooks/compose.ts @@ -0,0 +1,48 @@ +// TypeScript port of koa-compose (https://github.com/koajs/compose) +export type NextFunction = () => Promise + +export type AsyncMiddleware = (context: T, next: NextFunction) => Promise +export type Middleware = AsyncMiddleware + +export function compose(middleware: AsyncMiddleware[]) { + if (!Array.isArray(middleware)) { + throw new TypeError('Middleware stack must be an array!') + } + + for (const fn of middleware) { + if (typeof fn !== 'function') { + throw new TypeError('Middleware must be composed of functions!') + } + } + + return function (this: any, context: T, next?: AsyncMiddleware) { + // last called middleware # + let index = -1 + + return dispatch.call(this, 0) + + function dispatch(this: any, i: number): Promise { + if (i <= index) { + return Promise.reject(new Error('next() called multiple times')) + } + + index = i + + let fn: AsyncMiddleware | undefined = middleware[i] + + if (i === middleware.length) { + fn = next + } + + if (!fn) { + return Promise.resolve() + } + + try { + return Promise.resolve(fn.call(this, context, dispatch.bind(this, i + 1))) + } catch (err) { + return Promise.reject(err) + } + } + } +} diff --git a/packages/feathers/src/hooks/decorator.test.ts b/packages/feathers/src/hooks/decorator.test.ts new file mode 100644 index 0000000000..2c28320274 --- /dev/null +++ b/packages/feathers/src/hooks/decorator.test.ts @@ -0,0 +1,69 @@ +import { describe, expect, it } from 'vitest' +import assert from 'assert' +import { HookContext, hooks, middleware, NextFunction } from './index.js' + +describe('feathers/hooks decorator', () => { + it('hook decorator on method and classes with inheritance', async () => { + const expectedName = 'David NameFromTopLevel NameFromDummyClass' + + @hooks([ + async (ctx, next) => { + ctx.arguments[0] += ' NameFromTopLevel' + + await next() + + ctx.result += ' ResultFromTopLevel' + } + ]) + class TopLevel {} + + @hooks([ + async (ctx, next) => { + ctx.arguments[0] += ' NameFromDummyClass' + + await next() + + ctx.result += ' ResultFromDummyClass' + } + ]) + class DummyClass extends TopLevel { + @hooks( + middleware([ + async (ctx: HookContext, next: NextFunction) => { + assert.equal(ctx.method, 'sayHi') + assert.deepEqual(ctx.arguments, [expectedName]) + assert.equal(ctx.name, expectedName) + + await next() + + ctx.result += ' ResultFromMethodDecorator' + } + ]).params('name') + ) + async sayHi(name: string) { + return `Hi ${name}` + } + + @hooks() + async hookedFn() { + return 'Hooks with nothing' + } + + @hooks([async (_ctx: HookContext, next: NextFunction) => next()]) + async sayWorld() { + return 'World' + } + } + + const instance = new DummyClass() + + assert.equal( + await instance.sayHi('David'), + `Hi ${expectedName} ResultFromMethodDecorator ResultFromDummyClass ResultFromTopLevel` + ) + }) + + it('error cases', () => { + expect(() => hooks([])({}, 'test', { value: 'not a function' })).toThrow('Can not apply hooks.') + }) +}) diff --git a/packages/feathers/test/hooks/after.test.ts b/packages/feathers/src/hooks/feathers/after.test.ts similarity index 99% rename from packages/feathers/test/hooks/after.test.ts rename to packages/feathers/src/hooks/feathers/after.test.ts index d4440472fe..92dca247dc 100644 --- a/packages/feathers/test/hooks/after.test.ts +++ b/packages/feathers/src/hooks/feathers/after.test.ts @@ -1,5 +1,6 @@ +import { describe, it } from 'vitest' import assert from 'assert' -import { feathers, Id } from '../../src' +import { feathers, Id } from '../../index.js' describe('`after` hooks', () => { it('.after hooks can return a promise', async () => { diff --git a/packages/feathers/test/hooks/app.test.ts b/packages/feathers/src/hooks/feathers/app.test.ts similarity index 98% rename from packages/feathers/test/hooks/app.test.ts rename to packages/feathers/src/hooks/feathers/app.test.ts index a7c2df4e46..1c14efb808 100644 --- a/packages/feathers/test/hooks/app.test.ts +++ b/packages/feathers/src/hooks/feathers/app.test.ts @@ -1,6 +1,7 @@ +import { describe, it, beforeEach } from 'vitest' import assert from 'assert' -import { feathers, Application, ApplicationHookMap, ServiceInterface, Params } from '../../src' +import { feathers, Application, ApplicationHookMap, ServiceInterface, Params } from '../../index.js' type Todo = { id?: string diff --git a/packages/feathers/test/hooks/around.test.ts b/packages/feathers/src/hooks/feathers/around.test.ts similarity index 98% rename from packages/feathers/test/hooks/around.test.ts rename to packages/feathers/src/hooks/feathers/around.test.ts index d9277ae6da..ea55ad3287 100644 --- a/packages/feathers/test/hooks/around.test.ts +++ b/packages/feathers/src/hooks/feathers/around.test.ts @@ -1,5 +1,6 @@ +import { describe, it } from 'vitest' import assert from 'assert' -import { feathers, Params, ServiceInterface } from '../../src' +import { feathers, Params, ServiceInterface } from '../../index.js' describe('`around` hooks', () => { it('around hooks can set hook.result which will skip service method', async () => { diff --git a/packages/feathers/test/hooks/before.test.ts b/packages/feathers/src/hooks/feathers/before.test.ts similarity index 99% rename from packages/feathers/test/hooks/before.test.ts rename to packages/feathers/src/hooks/feathers/before.test.ts index a76e32954e..10c5e68419 100644 --- a/packages/feathers/test/hooks/before.test.ts +++ b/packages/feathers/src/hooks/feathers/before.test.ts @@ -1,5 +1,6 @@ +import { describe, it } from 'vitest' import assert from 'assert' -import { feathers, Params, ServiceInterface } from '../../src' +import { feathers, Params, ServiceInterface } from '../../index.js' describe('`before` hooks', () => { it('.before hooks can return a promise', async () => { diff --git a/packages/feathers/test/hooks/error.test.ts b/packages/feathers/src/hooks/feathers/error.test.ts similarity index 98% rename from packages/feathers/test/hooks/error.test.ts rename to packages/feathers/src/hooks/feathers/error.test.ts index 4c42d266cf..3358a94a8e 100644 --- a/packages/feathers/test/hooks/error.test.ts +++ b/packages/feathers/src/hooks/feathers/error.test.ts @@ -1,5 +1,6 @@ +import { describe, it, afterEach, beforeEach } from 'vitest' import assert from 'assert' -import { feathers, Application, FeathersService } from '../../src' +import { feathers, Application, FeathersService } from '../../index.js' describe('`error` hooks', () => { describe('on direct service method errors', () => { diff --git a/packages/feathers/test/hooks/hooks.test.ts b/packages/feathers/src/hooks/feathers/hooks.test.ts similarity index 98% rename from packages/feathers/test/hooks/hooks.test.ts rename to packages/feathers/src/hooks/feathers/hooks.test.ts index 8afd743309..ec8aae5293 100644 --- a/packages/feathers/test/hooks/hooks.test.ts +++ b/packages/feathers/src/hooks/feathers/hooks.test.ts @@ -1,6 +1,7 @@ +import { describe, it } from 'vitest' import assert from 'assert' -import { hooks, NextFunction } from '@feathersjs/hooks' -import { HookContext, createContext, feathers, Id, Params, ServiceInterface } from '../../src' +import { hooks, NextFunction } from '../index.js' +import { HookContext, createContext, feathers, Id, Params, ServiceInterface } from '../../index.js' describe('hooks basics', () => { it('mix @feathersjs/hooks and .hooks', async () => { diff --git a/packages/feathers/src/hooks/function.test.ts b/packages/feathers/src/hooks/function.test.ts new file mode 100644 index 0000000000..2596c93f68 --- /dev/null +++ b/packages/feathers/src/hooks/function.test.ts @@ -0,0 +1,501 @@ +import { it, describe, expect } from 'vitest' +import assert from 'assert' +import { + BaseHookContext, + functionHooks, + getManager, + HookContext, + hooks, + middleware, + NextFunction, + setMiddleware +} from './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]) + }) + + it('context has own properties', async () => { + const fn = hooks(hello, middleware([]).params('name')) + + const customContext = fn.createContext({ message: 'Hi !' }) + const resultContext: HookContext = await fn('Dave', {}, customContext) + const keys = Object.keys(resultContext) + + // console.log(keys) + // assert(!keys.includes('self')) + assert(keys.includes('message')) + assert(keys.includes('arguments')) + assert(keys.includes('result')) + }) + + it('same params and props throw an error', async () => { + const hello = async (name?: string) => { + return `Hello ${name}` + } + expect(() => hooks(hello, middleware([]).params('name').props({ name: 'David' }))).toThrow( + `Hooks can not have a property and param named 'name'. Use .defaults instead.` + ) + }) + + it('creates context with default params', async () => { + const fn = hooks( + hello, + middleware([ + async (ctx, next) => { + assert.deepEqual(ctx.params, {}) + + await next() + } + ]) + .params('name', 'params') + .defaults(() => { + return { + name: 'Bertho', + params: {} + } + }) + ) + + assert.strictEqual(await fn('Dave'), 'Hello Dave') + assert.strictEqual(await fn(), 'Hello Bertho') + }) + + it('returning an async iterator directly errors', async () => { + const iterable = async function* () { + yield 'Hello' + yield 'World' + } + + const fn = hooks(iterable, []) + + await expect(() => fn()).rejects.toThrow( + 'Function must return a Promise that resolves to an async iterable, not the iterable directly' + ) + }) +}) diff --git a/packages/feathers/src/hooks/hooks.ts b/packages/feathers/src/hooks/hooks.ts new file mode 100644 index 0000000000..ed70ba3fb2 --- /dev/null +++ b/packages/feathers/src/hooks/hooks.ts @@ -0,0 +1,119 @@ +import { AsyncMiddleware, compose } from './compose.js' +import { + convertOptions, + HookContext, + HookContextData, + HookOptions, + setManager, + setMiddleware +} from './base.js' +import { copyFnProperties, copyProperties } from './utils.js' + +export function getOriginal(fn: any): any { + return typeof fn.original === 'function' ? getOriginal(fn.original) : fn +} + +export function functionHooks(fn: F, managerOrMiddleware: HookOptions) { + if (typeof fn !== 'function') { + throw new Error('Can not apply hooks to non-function') + } + + const manager = convertOptions(managerOrMiddleware) + const wrapper: any = function (this: any, ...args: any[]) { + const { Context, original } = wrapper + // If we got passed an existing HookContext instance, we want to return it as well + const returnContext = args[args.length - 1] instanceof Context + // Use existing context or default + const base = returnContext ? (args.pop() as HookContext) : new Context() + // Initialize the context + const context = manager.initializeContext(this, args, base) + // Assemble the hook chain + const hookChain: AsyncMiddleware[] = [ + // Return `ctx.result` or the context + (ctx, next) => next().then(() => (returnContext ? ctx : ctx.result)) + ] + + // Create the hook chain by calling the `collectMiddleware function + const mw = manager.collectMiddleware(this, args) + + if (mw) { + Array.prototype.push.apply(hookChain, mw) + } + + // Runs the actual original method if `ctx.result` is not already set + hookChain.push((ctx, next) => { + if (!Object.prototype.hasOwnProperty.call(context, 'result')) { + const returnValue = original.apply(this, ctx.arguments) + + if (returnValue[Symbol.asyncIterator]) { + throw new Error( + 'Function must return a Promise that resolves to an async iterable, not the iterable directly' + ) + } + + return Promise.resolve(returnValue).then((result) => { + ctx.result = result + + return next() + }) + } + + return next() + }) + + return compose(hookChain).call(this, context) + } + + copyFnProperties(wrapper, fn) + copyProperties(wrapper, fn) + setManager(wrapper, manager) + + return Object.assign(wrapper, { + original: getOriginal(fn), + Context: manager.getContextClass(), + createContext: (data: HookContextData = {}) => { + return new wrapper.Context(data) + } + }) +} + +export type HookMap = { + [L in keyof O]?: HookOptions +} + +export function objectHooks(obj: any, hooks: HookMap | AsyncMiddleware[]) { + if (Array.isArray(hooks)) { + return setMiddleware(obj, hooks) + } + + for (const method of Object.keys(hooks)) { + const target = typeof obj[method] === 'function' ? obj : obj.prototype + const fn = target && target[method] + + if (typeof fn !== 'function') { + throw new Error(`Can not apply hooks. '${method}' is not a function`) + } + + const manager = convertOptions(hooks[method]) + + target[method] = functionHooks(fn, manager.props({ method })) + } + + return obj +} + +export const hookDecorator = (managerOrMiddleware?: HookOptions) => { + return (target: any, context: DecoratorContext) => { + const manager = convertOptions(managerOrMiddleware) + + if (context.kind === 'class') { + setManager(target.prototype, manager) + return target + } else if (context.kind === 'method') { + const method = String(context.name) + return functionHooks(target, manager.props({ method })) + } + + throw new Error('Can not apply hooks.') + } +} diff --git a/packages/feathers/src/hooks/index.ts b/packages/feathers/src/hooks/index.ts new file mode 100644 index 0000000000..43b19eb547 --- /dev/null +++ b/packages/feathers/src/hooks/index.ts @@ -0,0 +1,91 @@ +import { AsyncMiddleware } from './compose.js' +import { HookContext, HookContextConstructor, HookContextData, HookManager, HookOptions } from './base.js' +import { functionHooks, hookDecorator, HookMap, objectHooks } from './hooks.js' + +export * from './hooks.js' +export * from './compose.js' +export * from './base.js' +export * from './regular.js' + +export interface WrapperAddon { + original: F + Context: HookContextConstructor + createContext: (data?: HookContextData) => HookContext +} + +export type WrappedFunction = F & + ((...rest: any[]) => Promise | Promise) & + WrapperAddon + +export type MiddlewareOptions = { + params?: any + defaults?: any + props?: any +} + +/** + * Initializes a hook settings object with the given middleware. + * @param mw The list of middleware + * @param options Middleware options (params, default, props) + */ +export function middleware(mw?: AsyncMiddleware[], options?: MiddlewareOptions) { + const manager = new HookManager().middleware(mw) + + if (options) { + if (options.params) { + manager.params(...options.params) + } + + if (options.defaults) { + manager.defaults(options.defaults) + } + + if (options.props) { + manager.props(options.props) + } + } + + return manager +} + +/** + * Returns a new function that wraps an existing async function + * with hooks. + * + * @param fn The async function to add hooks to. + * @param manager An array of middleware or hook settings + * (`middleware([]).params()` etc.) + */ +export function hooks(fn: F & (() => void), manager?: HookManager): WrappedFunction + +/** + * Add hooks to one or more methods on an object or class. + * @param obj The object to add hooks to + * @param hookMap A map of middleware settings where the + * key is the method name. + */ +export function hooks(obj: O | (new (...args: any[]) => O), hookMap: HookMap | AsyncMiddleware[]): O + +/** + * Decorate a class method with hooks. + * @param manager The hooks settings + */ +export function hooks<_T = any>(manager?: HookOptions): any + +// Fallthrough to actual implementation +export function hooks(...args: any[]) { + const [target, _hooks] = args + + if ( + typeof target === 'function' && + (_hooks instanceof HookManager || Array.isArray(_hooks) || args.length === 1) + ) { + return functionHooks(target, _hooks) + } + + if (args.length === 2) { + return objectHooks(target, _hooks) + } + + return hookDecorator(target) +} diff --git a/packages/feathers/src/hooks/object.test.ts b/packages/feathers/src/hooks/object.test.ts new file mode 100644 index 0000000000..d6c8924c93 --- /dev/null +++ b/packages/feathers/src/hooks/object.test.ts @@ -0,0 +1,152 @@ +import { it, describe } from 'vitest' +import assert from 'assert' +import { HookContext, hooks, middleware, NextFunction } from './index.js' + +interface HookableObject { + test: string + sayHi(name: string): Promise + addOne(number: number): Promise +} + +const getObject = (): HookableObject => ({ + test: 'me', + + async sayHi(name: string) { + return `Hi ${name}` + }, + + async addOne(number: number) { + return number + 1 + } +}) + +describe('feathers/hooks object', () => { + it('hooks object with hook methods, sets method name', async () => { + const obj = getObject() + + const hookedObj = hooks(obj, { + sayHi: middleware([ + async (ctx: HookContext, next: NextFunction) => { + assert.deepEqual(ctx.arguments, ['David']) + assert.equal(ctx.method, 'sayHi') + assert.equal(ctx.self, obj) + + await next() + + ctx.result += '?' + } + ]), + addOne: middleware([ + async (ctx: HookContext, next: NextFunction) => { + ctx.arguments[0] += 1 + + await next() + } + ]) + }) + + assert.strictEqual(obj, hookedObj) + assert.equal(await hookedObj.sayHi('David'), 'Hi David?') + assert.equal(await hookedObj.addOne(1), 3) + }) + + it('hooks object and allows to customize context for method', async () => { + const obj = getObject() + const hookedObj = hooks(obj, { + sayHi: middleware([ + async (ctx: HookContext, next: NextFunction) => { + assert.deepEqual(ctx.arguments, ['David']) + assert.equal(ctx.method, 'sayHi') + assert.equal(ctx.name, 'David') + assert.equal(ctx.self, obj) + + ctx.name = 'Dave' + + await next() + + ctx.result += '?' + } + ]).params('name'), + + addOne: middleware([ + async (ctx: HookContext, next: NextFunction) => { + ctx.arguments[0] += 1 + + await next() + } + ]) + }) + + assert.strictEqual(obj, hookedObj) + assert.equal(await hookedObj.sayHi('David'), 'Hi Dave?') + assert.equal(await hookedObj.addOne(1), 3) + }) + + it('hooking multiple times works properly', async () => { + const obj = getObject() + + hooks(obj, { + sayHi: middleware([ + async (ctx: HookContext, next: NextFunction) => { + await next() + + ctx.result += '?' + } + ]) + }) + + hooks(obj, { + sayHi: middleware([ + async (ctx: HookContext, next: NextFunction) => { + await next() + + ctx.result += '!' + } + ]) + }) + + assert.equal(await obj.sayHi('David'), 'Hi David!?') + }) + + it('throws an error when hooking invalid method', async () => { + const obj = getObject() + + assert.throws( + () => + hooks(obj, { + test: middleware([ + async (_ctx, next) => { + await next() + } + ]) + }), + { + message: `Can not apply hooks. 'test' is not a function` + } + ) + }) + + it('works with object level hooks', async () => { + const obj = getObject() + + hooks(obj, [ + async (ctx: HookContext, next: NextFunction) => { + await next() + + ctx.result += '!' + } + ]) + + hooks(obj, { + sayHi: middleware([ + async (ctx: HookContext, next: NextFunction) => { + await next() + + ctx.result += '?' + } + ]) + }) + + assert.equal(await obj.sayHi('Dave'), 'Hi Dave?!') + }) +}) diff --git a/packages/feathers/src/hooks/regular.ts b/packages/feathers/src/hooks/regular.ts new file mode 100644 index 0000000000..92f9a95940 --- /dev/null +++ b/packages/feathers/src/hooks/regular.ts @@ -0,0 +1,66 @@ +import { compose } from './compose.js' +import { HookContext } from './base.js' + +export type RegularMiddleware = (context: T) => Promise | any +export interface RegularHookMap { + before?: RegularMiddleware[] + after?: RegularMiddleware[] + error?: RegularMiddleware[] +} + +export const runHook = (hook: RegularMiddleware, context: any, type?: string) => { + const typeBefore = context.type + if (type) context.type = type + return Promise.resolve(hook.call(context.self, context)).then((res: any) => { + if (type) context.type = typeBefore + if (res && res !== context) { + Object.assign(context, res) + } + }) +} + +export const runHooks = (hooks: RegularMiddleware[]) => (context: any) => + hooks.reduce((promise, hook) => promise.then(() => runHook(hook, context)), Promise.resolve(context)) + +export function fromBeforeHook(hook: RegularMiddleware) { + return (context: any, next: any) => { + return runHook(hook, context, 'before').then(next) + } +} + +export function fromAfterHook(hook: RegularMiddleware) { + return (context: any, next: any) => { + return next().then(() => runHook(hook, context, 'after')) + } +} + +export function fromErrorHook(hook: RegularMiddleware) { + return (context: any, next: any) => { + return next().catch((error: any) => { + if (context.error !== error || context.result !== undefined) { + ;(context as any).original = { ...context } + context.error = error + delete context.result + } + + return runHook(hook, context, 'error') + .then(() => { + if (context.result === undefined && context.error !== undefined) { + throw context.error + } + }) + .catch((error) => { + context.error = error + throw context.error + }) + }) + } +} + +export function collect({ before = [], after = [], error = [] }: RegularHookMap) { + const beforeHooks = before.map(fromBeforeHook) + const afterHooks = [...after].reverse().map(fromAfterHook) + const errorHooks = error.length ? [fromErrorHook(runHooks(error))] : [] + + return compose([...errorHooks, ...beforeHooks, ...afterHooks]) +} diff --git a/packages/feathers/src/hooks/utils.ts b/packages/feathers/src/hooks/utils.ts new file mode 100644 index 0000000000..6af71bea98 --- /dev/null +++ b/packages/feathers/src/hooks/utils.ts @@ -0,0 +1,31 @@ +export function copyProperties(target: F, ...originals: any[]) { + for (const original of originals) { + const originalProps = (Object.keys(original) as any).concat(Object.getOwnPropertySymbols(original)) + + for (const prop of originalProps) { + const propDescriptor = Object.getOwnPropertyDescriptor(original, prop) + + if (propDescriptor && !Object.prototype.hasOwnProperty.call(target, prop)) { + Object.defineProperty(target, prop, propDescriptor) + } + } + } + + return target +} + +export function copyFnProperties(target: F, original: any) { + const internalProps = ['name', 'length'] + + try { + for (const prop of internalProps) { + const value = original[prop] + + Object.defineProperty(target, prop, { value }) + } + } catch (_e) { + // Avoid IE error + } + + return target +} diff --git a/packages/feathers/src/http/index.test.ts b/packages/feathers/src/http/index.test.ts new file mode 100644 index 0000000000..a76be70e6e --- /dev/null +++ b/packages/feathers/src/http/index.test.ts @@ -0,0 +1,170 @@ +import { beforeAll, describe, it, expect } from 'vitest' +import { restTests, verify, getApp, createTestServer } from '../../fixtures/index.js' +import { CORS_HEADERS } from './index.js' + +const TEST_PORT = 4444 + +describe('http test', () => { + beforeAll(async () => { + const app = getApp() + await createTestServer(TEST_PORT, app) + }) + + it('throws 404 for not found pages', async () => { + const res = await fetch(`http://localhost:${TEST_PORT}/fdshjkl`) + + expect(res.status).toBe(404) + + const error = await res.json() + + expect(res.headers.get('Access-Control-Allow-Origin')).toBeTruthy() + expect(error.message).toBe('Path /fdshjkl not found') + expect(error.name).toBe('NotFound') + }) + + it('works with form encoded body', async () => { + const res = await fetch(`http://localhost:${TEST_PORT}/todos`, { + method: 'POST', + headers: { + 'Content-Type': 'application/x-www-form-urlencoded' + }, + body: new URLSearchParams({ description: 'Form encoded' }).toString() + }) + + expect(res.status).toBe(201) + verify.create({ description: 'Form encoded' }, await res.json()) + }) + + it('handles CORS', async () => { + let res = await fetch(`http://localhost:${TEST_PORT}/todos`, { + method: 'OPTIONS', + headers: { + 'Access-Control-Request-Method': 'GET', + Origin: 'http://localhost:3000' + } + }) + + expect(res.status).toBe(204) + expect(res.headers.get('access-control-allow-origin')).toBe('http://localhost:3000') + + res = await fetch(`http://localhost:${TEST_PORT}/fdshjkl`) + expect(res.headers.get('access-control-allow-origin')).toBeTruthy() + + res = await fetch(`http://localhost:${TEST_PORT}/todos`) + expect(res.headers.get('access-control-allow-origin')).toBeTruthy() + }) + + it('throws error on invalid request body', async () => { + const res = await fetch(`http://localhost:${TEST_PORT}/todos`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: 'invalid' + }) + + expect(res.status).toBe(400) + + const error = await res.json() + expect(error.message).toBe('Invalid request body') + expect(error.name).toBe('BadRequest') + }) + + it('errors when method is not allowed', async () => { + const res = await fetch(`http://localhost:${TEST_PORT}/todos`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'X-Service-Method': 'notAllowed' + }, + body: JSON.stringify({ description: 'Not allowed' }) + }) + + expect(res.status).toBe(405) + expect(res.headers.get('content-type')).toBe('application/json') + + const error = await res.json() + expect(error.message).toBe('Method `notAllowed` is not supported by this endpoint.') + expect(error.name).toBe('MethodNotAllowed') + }) + + describe('CORS and returning reponses', () => { + it('returns a custom response', async () => { + const res = await fetch(`http://localhost:${TEST_PORT}/test`) + const body = await res.text() + + expect(body).toBe('Plain text') + expect(res.status).toBe(200) + expect(res.headers.get('content-type')).toBe('text/plain') + expect(res.headers.get('x-custom-header')).toBe('test') + }) + + it('supports OPTIONS method', async () => { + const res = await fetch(`http://localhost:${TEST_PORT}/test`, { + method: 'OPTIONS', + headers: { + 'Access-Control-Request-Method': 'POST', + Origin: 'https://example.com' + } + }) + + expect(res.status).toBe(204) + expect(res.headers.get('access-control-allow-origin')).toBe('https://example.com') + expect(res.headers.get('access-control-allow-headers')).toBe(CORS_HEADERS.join(', ')) + expect(res.headers.get('access-control-allow-methods')).toBe('GET, OPTIONS') + }) + + it('returns 204 for no content', async () => { + const res = await fetch(`http://localhost:${TEST_PORT}/todos/nocontent`, { + method: 'GET', + headers: { + 'Content-Type': 'application/json' + } + }) + + expect(res.status).toBe(204) + }) + }) + + describe('streams async iterables', () => { + it('returns a stream', async () => { + const res = await fetch(`http://localhost:${TEST_PORT}/test/world`) + + expect(res.status).toBe(200) + expect(res.headers.get('content-type')).toBe('text/event-stream') + + const reader = res.body.getReader() + const decoder = new TextDecoder() + const messages = [] + + let done = false + while (!done) { + const { value, done: readerDone } = await reader.read() + done = readerDone + + if (value) { + const text = decoder.decode(value) + const eventChunks = text.split('\n\n').filter(Boolean) + + for (const chunk of eventChunks) { + const lines = chunk.split('\n') + const dataLine = lines.find((line) => line.startsWith('data: ')) + + if (dataLine) { + const jsonData = JSON.parse(dataLine.substring('data: '.length)) + messages.push(jsonData) + } + } + } + } + + expect(messages.length).toBe(5) + + for (let i = 1; i <= 5; i++) { + expect(messages[i - 1]).toEqual({ message: `Hello world ${i}` }) + } + }) + }) + + restTests('http', 'todos', TEST_PORT) +}) diff --git a/packages/feathers/src/http/index.ts b/packages/feathers/src/http/index.ts new file mode 100644 index 0000000000..5a68cf38f7 --- /dev/null +++ b/packages/feathers/src/http/index.ts @@ -0,0 +1,178 @@ +import type { Application, HookContext, Params } from '../index.js' +import type { Middleware } from './middleware.js' +import { BadRequest, MethodNotAllowed, NotFound } from '../errors.js' +import { hooks, middleware } from '../hooks/index.js' +import * as utils from './utils.js' +import { BODY_METHODS, bodyParser, errorHandler, queryParser } from './middleware.js' +import { createContext, getServiceOptions } from '../index.js' + +export type HttpParams = Params & { + request?: Request +} + +export * from './middleware.js' +export * from './sse.service.js' +export * from './utils.js' + +export const serviceToHttpMethod = { + find: 'GET', + get: 'GET', + create: 'POST', + update: 'PUT', + patch: 'PATCH', + remove: 'DELETE' +} as const + +export const CORS_HEADERS = [ + 'accept', + 'accept-language', + 'content-language', + 'content-type', + 'range', + 'authorization', + utils.METHOD_HEADER +] + +function handleResponse(request: Request, context: HookContext) { + const { status, headers: responseHeaders, body } = utils.getResponse(context) + const init = { + status, + headers: { + 'access-control-allow-origin': request.headers.get('Origin') || '*', + ...(responseHeaders as Record) + } + } + + if (!body) { + return new Response(null, init) + } + + return Response.json(body, init) +} + +function handleAsyncIterable(request: Request, context: HookContext) { + const { readable, writable } = new TransformStream() + const writer = writable.getWriter() + + const abortSignal = request.signal + + abortSignal.addEventListener('abort', () => { + writer.close() + }) + + const handleStream = async () => { + try { + for await (const item of context.result) { + try { + await writer.write(new TextEncoder().encode(`data: ${JSON.stringify(item)}\n\n`)) + } catch (error) { + // Handle invalid state errors gracefully + if ((error as { code?: string }).code === 'ERR_INVALID_STATE') { + break + } + throw error + } + } + } finally { + try { + await writer.close() + } catch (_error) {} + } + } + + handleStream() + + return new Response(readable, { + headers: { + 'access-control-allow-origin': request.headers.get('Origin') || '*', + 'content-type': 'text/event-stream', + 'cache-control': 'no-cache', + connection: 'keep-alive' + } + }) +} + +export function createHandler( + app: Application, + mw: Middleware[] = [errorHandler(), queryParser(), bodyParser()] +) { + const handler = async (request: Request, ...rest: unknown[]) => { + const [params = {}, data] = rest as [Params, Record | null] + const url = new URL(request.url) + const lookup = app.lookup(url.pathname) + const headers = params.headers || Object.fromEntries(request.headers) + + if (lookup === null) { + throw new NotFound(`Path ${url.pathname} not found`) + } + + if (BODY_METHODS.includes(request.method) && data === null) { + throw new BadRequest('Invalid request body') + } + + // lookup the route for the request + const { service, params: { __id = null, ...route } = {} } = lookup + + if (request.method === 'OPTIONS') { + const methods = Object.keys(serviceToHttpMethod).reduce((result, name) => { + if (typeof (service as any)[name] === 'function') { + result.add(serviceToHttpMethod[name as keyof typeof serviceToHttpMethod]) + } + + return result + }, new Set()) + // Handle CORS pre-flight request + return new Response(null, { + status: 204, + headers: { + 'access-control-allow-origin': headers.origin || '*', + 'access-control-allow-methods': [...methods, 'OPTIONS'].join(', '), + 'access-control-allow-headers': CORS_HEADERS.join(', '), + 'access-control-allow-credentials': 'true' + } + }) + } + + const id = __id === null ? null : decodeURIComponent(__id) + // If the request has a method override header, use it instead of the request method. + const methodOverride = headers[utils.METHOD_HEADER] + // Get the service method for the request. + const method = utils.getServiceMethod(request.method, id, methodOverride) + // Get the methods supported by the service. + const { methods } = getServiceOptions(service) + + // If the service does not support the requested method, throw an error. + if (methods && !methods.includes(method)) { + throw new MethodNotAllowed(`Method \`${method}\` is not supported by this endpoint.`) + } + + // Create the arguments for the service method. + const createArguments = + utils.argumentsFor[method as keyof typeof utils.argumentsFor] || utils.argumentsFor.default + + // Create the params object + const serviceParams: HttpParams = { + provider: 'rest', + request, + headers, + route, + ...params + } + + // Create the hook context. + const hookContext = createContext(service, method) + // Run the service method. + const args = createArguments({ id, data, params: serviceParams }) + const context = await (service as any)[method](...args, hookContext) + + if (context.result instanceof Response) { + return context.result + } else if (context.result?.[Symbol.asyncIterator]) { + return handleAsyncIterable(request, context) + } else { + return handleResponse(request, context) + } + } + + return hooks(handler, middleware(mw).params('request', 'params', 'data')) +} diff --git a/packages/feathers/src/http/middleware.ts b/packages/feathers/src/http/middleware.ts new file mode 100644 index 0000000000..4c3210b53b --- /dev/null +++ b/packages/feathers/src/http/middleware.ts @@ -0,0 +1,79 @@ +import type { Params, Service, Query } from '../index.js' +import type { HookContext, NextFunction } from '../hooks/index.js' +import { BadRequest, FeathersError } from '../errors.js' +import qs from 'qs' + +interface RouteLookup { + service: Service + params: { + [key: string]: any + } +} + +export const BODY_METHODS = ['POST', 'PUT', 'PATCH'] + +export interface HandlerContext extends HookContext { + request: Request + data: Record | null + params: Params & { http: Record } + lookup: RouteLookup | null +} + +export type Middleware = (context: HandlerContext, next: NextFunction) => Promise + +export function bodyParser() { + return async (context: HandlerContext, next: NextFunction) => { + const contentType = context.request.headers.get('content-type') + + if (BODY_METHODS.includes(context.request.method)) { + const request = context.request.clone() + + try { + if (contentType?.includes('application/json')) { + context.data = await request.json() + } else if (contentType?.includes('application/x-www-form-urlencoded')) { + context.data = Object.fromEntries(new URLSearchParams(await request.text())) + } else { + throw new Error('Invalid content type') + } + } catch (error) { + throw new BadRequest('Invalid request body') + } + } + + return next() + } +} + +export function queryParser(parser: (query: string) => Query = qs.parse) { + return async (context: HandlerContext, next: NextFunction) => { + const { request } = context + const url = new URL(request.url) + + context.params = { + ...context.params, + query: parser(url.search.substring(1)) + } + + return next() + } +} + +export function errorHandler() { + return async (context: HandlerContext, next: NextFunction) => { + try { + await next() + } catch (error: any) { + const errorData = error.toJSON ? error.toJSON() : { message: error.message } + const status = error instanceof FeathersError ? error.code || 500 : 500 + const origin = context.request.headers.get('origin') || '*' + + context.result = Response.json(errorData, { + status, + headers: { + 'access-control-allow-origin': origin + } + }) + } + } +} diff --git a/packages/feathers/src/http/sse.service.test.ts b/packages/feathers/src/http/sse.service.test.ts new file mode 100644 index 0000000000..0b8e28b2a2 --- /dev/null +++ b/packages/feathers/src/http/sse.service.test.ts @@ -0,0 +1,237 @@ +import { describe, it, expect, beforeEach } from 'vitest' +import { feathers, Application } from '../index.js' +import { SseService, SsePayload } from './sse.service.js' + +class TestService { + events = ['foo', 'bar'] + + async create(payload: any) { + return payload + } + + async update(id: any, payload: any) { + return { id, ...payload } + } + + async remove(id: any) { + return { id } + } +} + +describe('SseService', () => { + let app: Application<{ test: TestService; sse: SseService }> + let connection: any + + beforeEach(async () => { + app = feathers() + app.use('sse', new SseService()) + app.use('test', new TestService()) + + connection = { query: { name: 'feathers' } } + + await app.setup() + }) + + describe('find method', () => { + it('creates an async generator that listens to publish events', async () => { + const generator = await app.service('sse').find(connection) + + expect(generator).toBeDefined() + expect(typeof generator[Symbol.asyncIterator]).toBe('function') + }) + + it('yields initial connected event', async () => { + const generator = await app.service('sse').find(connection) + const iterator = generator[Symbol.asyncIterator]() + const result = await iterator.next() + + expect(result.done).toBe(false) + expect(result.value).toEqual({ + event: 'connected', + data: { name: 'feathers' }, + path: 'sse' + }) + + await iterator.return() + }) + + it('yields events when connection is included in channel', async () => { + const generator = await app.service('sse').find(connection) + const iterator = generator[Symbol.asyncIterator]() + const connectedResult = await iterator.next() + expect((connectedResult.value as SsePayload).event).toBe('connected') + + app.channel('test-channel').join(connection) + app.publish('created', () => app.channel('test-channel')) + + setImmediate(async () => { + await app.service('test').create({ id: 1, text: 'Test todo' }) + }) + + const result = await iterator.next() + + expect(result.done).toBe(false) + expect(result.value).toEqual({ + event: 'created', + data: { id: 1, text: 'Test todo' }, + path: 'test' + }) + + await iterator.return() + }) + + it('only publishes to joined channels', async () => { + const generator = await app.service('sse').find(connection) + const iterator = generator[Symbol.asyncIterator]() + const connectedResult = await iterator.next() + expect((connectedResult.value as SsePayload).event).toBe('connected') + + app.channel('test-channel').join(connection) + app.publish((data: { name: string }) => app.channel(`${data.name}-channel`)) + + setImmediate(async () => { + await app.service('test').create({ + id: 1, + text: 'Test todo', + name: 'something' + }) + await app.service('test').create({ + id: 2, + text: 'Actual test todo', + name: 'test' + }) + }) + + const result = await iterator.next() + + expect(result.done).toBe(false) + expect(result.value).toEqual({ + event: 'created', + data: { + id: 2, + text: 'Actual test todo', + name: 'test' + }, + path: 'test' + }) + + await iterator.return() + }) + + it('uses channel.dataFor when available', async () => { + const generator = await app.service('sse').find(connection) + const iterator = generator[Symbol.asyncIterator]() + const connectedResult = await iterator.next() + + expect((connectedResult.value as SsePayload).event).toBe('connected') + + const customData = { customized: true, id: 1 } + const channel = app.channel('test-channel').join(connection).send(customData) + + app.service('test').registerPublisher('updated', () => channel) + + setImmediate(async () => { + await app.service('test').update(1, { name: 'John' }) + }) + + const result = await iterator.next() + + expect(result.value).toEqual({ + event: 'updated', + data: customData, + path: 'test' + }) + + await iterator.return() + }) + + it('queues multiple events correctly', async () => { + const generator = await app.service('sse').find(connection) + const iterator = generator[Symbol.asyncIterator]() + const connectedResult = await iterator.next() + expect((connectedResult.value as SsePayload).event).toBe('connected') + + const channel = app.channel('test-channel').join(connection) + + app.service('test').registerPublisher('created', () => channel) + app.service('test').registerPublisher('updated', () => channel) + app.service('test').registerPublisher('removed', () => channel) + + setImmediate(async () => { + await app.service('test').create({ id: 1, text: 'First' }) + setImmediate(async () => { + await app.service('test').update(1, { text: 'Updated' }) + setImmediate(async () => { + await app.service('test').remove(1) + }) + }) + }) + + const events: SsePayload[] = [] + const result1 = await iterator.next() + events.push(result1.value as SsePayload) + + const result2 = await iterator.next() + events.push(result2.value as SsePayload) + + const result3 = await iterator.next() + events.push(result3.value as SsePayload) + + expect(events).toHaveLength(3) + expect(events[0].event).toBe('created') + expect(events[1].event).toBe('updated') + expect(events[2].event).toBe('removed') + + await iterator.return() + }) + + it('handles multiple connections in the same channel', async () => { + const connection1 = { query: { name: 'daffl' } } + const connection2 = { query: { name: 'someone' } } + + const generator1 = await app.service('sse').find(connection1) + const generator2 = await app.service('sse').find(connection2) + + const iterator1 = generator1[Symbol.asyncIterator]() + const iterator2 = generator2[Symbol.asyncIterator]() + + const connectedResult1 = await iterator1.next() + expect((connectedResult1.value as SsePayload).event).toBe('connected') + const connectedResult2 = await iterator2.next() + expect((connectedResult2.value as SsePayload).event).toBe('connected') + + const channel = app.channel('broadcast-channel').join(connection1, connection2) + app.service('test').registerPublisher('created', () => channel) + + setImmediate(async () => { + await app.service('test').create({ id: 1, text: 'Broadcast message' }) + }) + + const [result1, result2] = await Promise.all([iterator1.next(), iterator2.next()]) + + expect(result1.value).toEqual({ + event: 'created', + data: { id: 1, text: 'Broadcast message' }, + path: 'test' + }) + + expect(result2.value).toEqual({ + event: 'created', + data: { id: 1, text: 'Broadcast message' }, + path: 'test' + }) + + await Promise.all([iterator1.return(), iterator2.return()]) + }) + + it('properly cleans up when generator is closed', async () => { + const generator = await app.service('sse').find(connection) + const iterator = generator[Symbol.asyncIterator]() + + await iterator.return() + + const result = await iterator.next() + expect(result.done).toBe(true) + }) + }) +}) diff --git a/packages/feathers/src/http/sse.service.ts b/packages/feathers/src/http/sse.service.ts new file mode 100644 index 0000000000..5cb441f90d --- /dev/null +++ b/packages/feathers/src/http/sse.service.ts @@ -0,0 +1,74 @@ +import { CombinedChannel } from '../channel/combined.js' +import { Application, HookContext, Params } from '../declarations.js' + +export type SsePayload = { + event: string + data: unknown + path?: string +} + +export class SseService { + app?: Application + path?: string + + async find(connection: Params) { + const eventBuffer: SsePayload[] = [] + const { app, path } = this + + if (!app || !path) { + throw new Error('Can not initialize SSE. Did you call app.setup()?') + } + + let isActive = true + let pendingResolve: (() => void) | null = null + + const publishHandler = (event: string, channel: CombinedChannel, hook: HookContext, data: unknown) => { + if (isActive && channel.connections.includes(connection)) { + const eventData = channel.dataFor ? (channel.dataFor(connection) ?? data) : data + eventBuffer.push({ + event, + data: eventData, + path: hook.path + }) + + if (pendingResolve) { + pendingResolve() + pendingResolve = null + } + } + } + + app.emit('connection', connection) + app.addListener('publish', publishHandler) + + const stream = async function* () { + try { + yield { + event: 'connected', + data: connection.query || {}, + path + } + + while (isActive) { + while (eventBuffer.length > 0) { + yield eventBuffer.shift()! + } + + await new Promise((resolve) => { + pendingResolve = resolve + }) + } + } finally { + isActive = false + app.removeListener('publish', publishHandler) + } + } + + return stream() + } + + async setup(app: Application, path: string) { + this.app = app + this.path = path + } +} diff --git a/packages/transport-commons/test/http.test.ts b/packages/feathers/src/http/utils.test.ts similarity index 83% rename from packages/transport-commons/test/http.test.ts rename to packages/feathers/src/http/utils.test.ts index ca15f9c499..5855b8c09a 100644 --- a/packages/transport-commons/test/http.test.ts +++ b/packages/feathers/src/http/utils.test.ts @@ -1,6 +1,7 @@ +import { describe, it } from 'vitest' import assert from 'assert' -import { HookContext } from '@feathersjs/feathers' -import { http } from '../src' +import { HookContext } from '../index.js' +import * as http from './utils.js' describe('@feathersjs/transport-commons HTTP helpers', () => { it('getResponse body', () => { @@ -63,6 +64,19 @@ describe('@feathersjs/transport-commons HTTP helpers', () => { assert.deepStrictEqual(http.getResponse(locationContext as HookContext).headers, { Location: '/' }) + + assert.deepStrictEqual( + http.getResponse({ + http: { + location: + 'https://github.com/login/oauth/authorize?redirect_uri=http%3A%2F%2Flocalhost%3A8787%2Foauth%2Fgithub%2Fcallback' + } + } as HookContext).headers, + { + Location: + 'https://github.com/login/oauth/authorize?redirect_uri=http%3A%2F%2Flocalhost%3A8787%2Foauth%2Fgithub%2Fcallback' + } + ) }) it('getServiceMethod', () => { diff --git a/packages/transport-commons/src/http.ts b/packages/feathers/src/http/utils.ts similarity index 90% rename from packages/transport-commons/src/http.ts rename to packages/feathers/src/http/utils.ts index f7114b238f..e5ff214280 100644 --- a/packages/transport-commons/src/http.ts +++ b/packages/feathers/src/http/utils.ts @@ -1,6 +1,5 @@ -import { MethodNotAllowed } from '@feathersjs/errors/lib' -import { HookContext, NullableId, Params } from '@feathersjs/feathers' -import encodeUrl from 'encodeurl' +import { MethodNotAllowed } from '../errors.js' +import type { HookContext, NullableId, Params, Query } from '../declarations.js' export const METHOD_HEADER = 'x-service-method' @@ -85,7 +84,7 @@ export function getResponse(context: HookContext) { let location = headers.Location if (http.location !== undefined) { - location = encodeUrl(http.location) + location = http.location headers = { ...headers, Location: location } } @@ -93,3 +92,5 @@ export function getResponse(context: HookContext) { return { status, headers, body } } + +export type QueryStringify = (query: Query) => string diff --git a/packages/feathers/src/index.ts b/packages/feathers/src/index.ts index c37bfef951..5030729063 100644 --- a/packages/feathers/src/index.ts +++ b/packages/feathers/src/index.ts @@ -1,20 +1,21 @@ -import { setDebug } from '@feathersjs/commons' - -import version from './version' -import { Feathers } from './application' -import { Application } from './declarations' +import { setDebug } from './debug.js' +import version from './version.js' +import { Feathers } from './application.js' +import { Application } from './declarations.js' export function feathers() { - return new Feathers() as Application + return new Feathers() as unknown as Application } feathers.setDebug = setDebug export { version, Feathers } -export * from './hooks' -export * from './declarations' -export * from './service' +export { Channel } from './channel/base.js' +export { CombinedChannel } from './channel/combined.js' +export * as channelUtils from './channel/mixin.js' -if (typeof module !== 'undefined') { - module.exports = Object.assign(feathers, module.exports) -} +export * from './hooks.js' +export * from './declarations.js' +export * from './service.js' +export * from './debug.js' +export * from './router.js' diff --git a/packages/feathers/src/router.test.ts b/packages/feathers/src/router.test.ts new file mode 100644 index 0000000000..a0593c7f43 --- /dev/null +++ b/packages/feathers/src/router.test.ts @@ -0,0 +1,264 @@ +import assert from 'assert' +import { describe, it, beforeEach } from 'vitest' +import { Router } from './router.js' +import { Application } from './declarations.js' +import { feathers } from './index.js' + +describe('routing', () => { + describe('app.routes', () => { + let app: Application + + beforeEach(() => { + app = feathers() + + app.use('/my/service', { + get(id: string | number) { + return Promise.resolve({ id }) + } + }) + }) + + it('has app.lookup and app.routes', () => { + assert.strictEqual(typeof app.lookup, 'function') + assert.ok(app.routes) + }) + + it('returns null when nothing is found', () => { + const result = app.lookup('me/service') + + assert.strictEqual(result, null) + }) + + it('returns null for invalid service path', () => { + assert.strictEqual(app.lookup(null), null) + // @ts-expect-error Testing invalid lookup + assert.strictEqual(app.lookup({}), null) + }) + + it('can look up and strips slashes', () => { + const result = app.lookup('my/service') + + assert.strictEqual(result.service, app.service('/my/service/')) + }) + + it('can look up case insensitive', () => { + app.routes.caseSensitive = false + + const result = app.lookup('/My/ServicE') + + assert.strictEqual(result.service, app.service('my/service')) + }) + + it('can look up with id', () => { + const result = app.lookup('/my/service/1234') + + assert.strictEqual(result.service, app.service('/my/service')) + assert.deepStrictEqual(result.params, { + __id: '1234' + }) + }) + + it('can look up with params, id and special characters', () => { + const path = '/test/:first/my/:second' + + app.use(path, { + async get(id: string | number) { + return { id } + } + }) + + const result = app.lookup('/test/me/my/::special/testing') + + assert.strictEqual(result.service, app.service(path)) + assert.deepStrictEqual(result.params, { + __id: 'testing', + first: 'me', + second: '::special' + }) + }) + + it('can register routes with preset params', () => { + app.routes.insert('/my/service/:__id/preset', { + service: app.service('/my/service'), + params: { preset: true } + }) + + const result = app.lookup('/my/service/1234/preset') + + assert.strictEqual(result.service, app.service('/my/service')) + assert.deepStrictEqual(result.params, { + preset: true, + __id: '1234' + }) + }) + + it('can pass route params during a service registration', () => { + app.use( + '/other/service', + { + async get(id: any) { + return id + } + }, + { + routeParams: { used: true } + } + ) + + const result = app.lookup('/other/service/1234') + + assert.strictEqual(result.service, app.service('/other/service')) + assert.deepStrictEqual(result.params, { + used: true, + __id: '1234' + }) + }) + + it('can unregister a service (#2035)', async () => { + const result = app.lookup('my/service') + + assert.strictEqual(result.service, app.service('/my/service/')) + + await app.unuse('/my/service') + + assert.strictEqual(app.lookup('my/service'), null) + }) + }) + + describe('router', () => { + it('can lookup and insert a simple path and returns null for invalid path', () => { + const r = new Router() + + r.insert('/hello/there/you', 'test') + + const result = r.lookup('hello/there/you/') + + assert.deepStrictEqual(result, { + params: {}, + data: 'test' + }) + + assert.strictEqual(r.lookup('not/there'), null) + assert.strictEqual(r.lookup('not-me'), null) + }) + + it('can insert data at the root', () => { + const r = new Router() + + r.insert('', 'hi') + + const result = r.lookup('/') + + assert.deepStrictEqual(result, { + params: {}, + data: 'hi' + }) + }) + + it('can insert with placeholder and has proper specificity', () => { + const r = new Router() + + r.insert('/hello/:id', 'one') + r.insert('/hello/:id/you', 'two') + r.insert('/hello/:id/:other', 'three') + + const first = r.lookup('hello/there/') + + assert.throws(() => r.insert('/hello/:id/you', 'two'), { + message: 'Path hello/:id/you already exists' + }) + + assert.deepStrictEqual(first, { + params: { id: 'there' }, + data: 'one' + }) + + const second = r.lookup('hello/yes/you') + + assert.deepStrictEqual(second, { + params: { id: 'yes' }, + data: 'two' + }) + + const third = r.lookup('hello/yes/they') + + assert.deepStrictEqual(third, { + params: { + id: 'yes', + other: 'they' + }, + data: 'three' + }) + + assert.strictEqual(r.lookup('hello/yes/they/here'), null) + }) + + it('works with different placeholders in different paths (#2327)', () => { + const r = new Router() + + r.insert('/hello/:id', 'one') + r.insert('/hello/:test/you', 'two') + r.insert('/hello/:test/:two/hi/:three', 'three') + r.insert('/hello/:test/:two/hi', 'four') + + assert.deepStrictEqual(r.lookup('/hello/there'), { + params: { id: 'there' }, + data: 'one' + }) + assert.deepStrictEqual(r.lookup('/hello/there/you'), { + params: { test: 'there' }, + data: 'two' + }) + assert.strictEqual(r.lookup('/hello/there/bla'), null) + assert.deepStrictEqual(r.lookup('/hello/there/maybe/hi'), { + params: { test: 'there', two: 'maybe' }, + data: 'four' + }) + assert.deepStrictEqual(r.lookup('/hello/there/maybe/hi/test'), { + params: { three: 'test', two: 'maybe', test: 'there' }, + data: 'three' + }) + }) + + it('can remove paths (#2035)', () => { + const r = new Router() + + r.insert('/hello/:id', 'one') + r.insert('/hello/:test/you', 'two') + r.insert('/hello/here/thing', 'else') + + assert.deepStrictEqual(r.lookup('hello/there'), { params: { id: 'there' }, data: 'one' }) + + r.remove('/hello/:id') + + assert.deepStrictEqual(r.lookup('hello/here/you'), { params: { test: 'here' }, data: 'two' }) + assert.deepStrictEqual(r.lookup('hello/here/thing'), { params: {}, data: 'else' }) + assert.strictEqual(r.lookup('hello/there'), null) + + r.remove('/hello/:test/you') + assert.deepStrictEqual(r.lookup('hello/here/you'), null) + assert.deepStrictEqual(r.lookup('hello/here/thing'), { params: {}, data: 'else' }) + + r.remove('/hello/here/thing') + assert.ok(!r.root.hasChildren) + }) + + it('re-initialize a service with children. (#3432)', () => { + const r = new Router() + + r.insert('/hello', 'one') + r.insert('/hello/world', 'else') + + assert.deepStrictEqual(r.lookup('hello'), { params: {}, data: 'one' }) + + r.remove('/hello') + + assert.deepStrictEqual(r.lookup('hello/world'), { params: {}, data: 'else' }) + + r.insert('/hello', 'two') + + assert.deepStrictEqual(r.lookup('hello'), { params: {}, data: 'two' }) + assert.deepStrictEqual(r.lookup('hello/world'), { params: {}, data: 'else' }) + }) + }) +}) diff --git a/packages/transport-commons/src/routing/router.ts b/packages/feathers/src/router.ts similarity index 98% rename from packages/transport-commons/src/routing/router.ts rename to packages/feathers/src/router.ts index e45e6674b3..20ee2b747d 100644 --- a/packages/transport-commons/src/routing/router.ts +++ b/packages/feathers/src/router.ts @@ -1,4 +1,4 @@ -import { stripSlashes } from '@feathersjs/commons' +import { stripSlashes } from './commons.js' export interface LookupData { params: { [key: string]: string } diff --git a/packages/feathers/src/service.ts b/packages/feathers/src/service.ts index eb852f39b9..ee431bc000 100644 --- a/packages/feathers/src/service.ts +++ b/packages/feathers/src/service.ts @@ -1,6 +1,6 @@ import { EventEmitter } from 'events' -import { createSymbol } from '@feathersjs/commons' -import { ServiceOptions } from './declarations' +import { createSymbol } from './commons.js' +import { ServiceOptions } from './declarations.js' export const SERVICE = createSymbol('@feathersjs/service') @@ -25,7 +25,20 @@ 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']) + .concat([ + 'all', + 'around', + 'before', + 'after', + 'error', + 'hooks', + 'setup', + 'teardown', + 'publish', + 'registerPublisher' + ]) + +export const protectedProperties = protectedMethods.concat(['service', 'events', 'id']) export function getHookMethods(service: any, options: ServiceOptions) { const { methods } = options diff --git a/packages/feathers/tsconfig.json b/packages/feathers/tsconfig.json index b184375928..2ea7169ce3 100644 --- a/packages/feathers/tsconfig.json +++ b/packages/feathers/tsconfig.json @@ -1,8 +1,8 @@ { "extends": "../../tsconfig", - "include": [ - "src/**/*.ts" - ], + "rootDir": "src", + "include": ["src/**/*.ts"], + "exclude": ["src/**/*.test.ts", "src/**/test/**"], "compilerOptions": { "outDir": "lib" } diff --git a/packages/generators/CHANGELOG.md b/packages/generators/CHANGELOG.md deleted file mode 100644 index 98e24780ec..0000000000 --- a/packages/generators/CHANGELOG.md +++ /dev/null @@ -1,230 +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.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) - -### Bug Fixes - -- **generators:** Add FeathersGeneratorError ([#3556](https://github.com/feathersjs/feathers/issues/3556)) ([2a81a20](https://github.com/feathersjs/feathers/commit/2a81a204eb55c95d20fc45bf091c0131eff5a25d)) - -## [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/generators - -## [5.0.29](https://github.com/feathersjs/feathers/compare/v5.0.28...v5.0.29) (2024-07-10) - -### Bug Fixes - -- **generators:** Fix generating of gitignore ([#3514](https://github.com/feathersjs/feathers/issues/3514)) ([cabc397](https://github.com/feathersjs/feathers/commit/cabc397d2e4378c4bce79a60f2d196713cce4d8c)) - -## [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/generators - -## [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/generators - -## [5.0.26](https://github.com/feathersjs/feathers/compare/v5.0.25...v5.0.26) (2024-06-09) - -### Bug Fixes - -- **generators:** Fix migrate:make script in generated app ([#3490](https://github.com/feathersjs/feathers/issues/3490)) ([c7b0111](https://github.com/feathersjs/feathers/commit/c7b011150152e62a35f3f8ab04d6dde6d6727583)) - -## [5.0.25](https://github.com/feathersjs/feathers/compare/v5.0.24...v5.0.25) (2024-05-03) - -### Bug Fixes - -- **generators:** better types for enabled methods ([#3474](https://github.com/feathersjs/feathers/issues/3474)) ([bdb3d3a](https://github.com/feathersjs/feathers/commit/bdb3d3a308322bfed3caa4214e4b6a72f1a84944)) - -## [5.0.24](https://github.com/feathersjs/feathers/compare/v5.0.23...v5.0.24) (2024-03-13) - -### Bug Fixes - -- **generators:** Use module format for JS Knex migrations ([#3444](https://github.com/feathersjs/feathers/issues/3444)) ([3feaa71](https://github.com/feathersjs/feathers/commit/3feaa719443aa30b1121d928ba5b7b8f43837ffb)) - -## [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/generators - -## [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/generators - -## [5.0.20](https://github.com/feathersjs/feathers/compare/v5.0.19...v5.0.20) (2024-01-24) - -### Bug Fixes - -- **generators:** Use cross-platform ES module \_\_dirname ([#3402](https://github.com/feathersjs/feathers/issues/3402)) ([0ac4882](https://github.com/feathersjs/feathers/commit/0ac4882663bb6a78622be0d903ae6508ecb516ad)) - -## [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/generators - -## [5.0.18](https://github.com/feathersjs/feathers/compare/v5.0.17...v5.0.18) (2024-01-22) - -### Bug Fixes - -- **cli:** Another fix for CLI ES module loading ([#3397](https://github.com/feathersjs/feathers/issues/3397)) ([3cb3bc9](https://github.com/feathersjs/feathers/commit/3cb3bc9a32602d82193b781b583ed0f37044e778)) - -## [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/generators - -## [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/generators - -## [5.0.15](https://github.com/feathersjs/feathers/compare/v5.0.14...v5.0.15) (2024-01-22) - -### Bug Fixes - -- **generators:** Move generators and CLI to featherscloud/pinion ([#3386](https://github.com/feathersjs/feathers/issues/3386)) ([eb87c99](https://github.com/feathersjs/feathers/commit/eb87c9922db56c5610e5b808f3ffe033c830e2b2)) - -## [5.0.14](https://github.com/feathersjs/feathers/compare/v5.0.13...v5.0.14) (2024-01-05) - -### Bug Fixes - -- **generators:** Harden mongodb.js to reliably extract database from any connection string ([#3264](https://github.com/feathersjs/feathers/issues/3264)) ([7b0f82c](https://github.com/feathersjs/feathers/commit/7b0f82c631ff5549cdc9a8e0ffcc705d067c2157)) - -## [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/generators - -## [5.0.12](https://github.com/feathersjs/feathers/compare/v5.0.11...v5.0.12) (2023-11-28) - -### Bug Fixes - -- **generators:** use `export type` vs `export` ([#3246](https://github.com/feathersjs/feathers/issues/3246)) ([82d30fd](https://github.com/feathersjs/feathers/commit/82d30fd37914e61935e068e89fc389f6bf47aaad)) - -## [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)) -- **schema:** HookContext is now typed in schema ([#3306](https://github.com/feathersjs/feathers/issues/3306)) ([65fab86](https://github.com/feathersjs/feathers/commit/65fab86407b813122f24db928a59986c7286f270)) - -## [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/generators - -## [5.0.9](https://github.com/feathersjs/feathers/compare/v5.0.8...v5.0.9) (2023-09-27) - -### Bug Fixes - -- **generators:** Fix configure channels when not real-time app ([#3271](https://github.com/feathersjs/feathers/issues/3271)) ([c619ab2](https://github.com/feathersjs/feathers/commit/c619ab2c57f692c419fee610c269c1502b124852)) - -## [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/generators - -## [5.0.7](https://github.com/feathersjs/feathers/compare/v5.0.6...v5.0.7) (2023-07-14) - -### Bug Fixes - -- **generators:** Fix channel/service configuration order for Koa based apps ([580344e](https://github.com/feathersjs/feathers/commit/580344e96fe8a2f17fd53476af5a0c7ddefac0b6)) - -## [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/generators - -## [5.0.5](https://github.com/feathersjs/feathers/compare/v5.0.4...v5.0.5) (2023-04-28) - -### Bug Fixes - -- **generators:** Add sourceMap to tsconfig.json template ([#3166](https://github.com/feathersjs/feathers/issues/3166)) ([3049b7a](https://github.com/feathersjs/feathers/commit/3049b7a425d01cdd3058442c7183307a06cfc87a)) - -## [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)) -- **generators:** Properly log unhandled rejection ([#3149](https://github.com/feathersjs/feathers/issues/3149)) ([eda8f78](https://github.com/feathersjs/feathers/commit/eda8f78fa5084c3247ad10b051610b3c51a13d24)) - -## [5.0.2](https://github.com/feathersjs/feathers/compare/v5.0.1...v5.0.2) (2023-03-23) - -### Bug Fixes - -- **generators:** Make sure TypeScript version in generated app matches ([#3122](https://github.com/feathersjs/feathers/issues/3122)) ([f0acfdf](https://github.com/feathersjs/feathers/commit/f0acfdf9d33337bf40ca12126c2550f56e31fa3b)) - -## [5.0.1](https://github.com/feathersjs/feathers/compare/v5.0.0...v5.0.1) (2023-03-15) - -### Bug Fixes - -- **generators:** Conditionally import channels in Express app ([#3106](https://github.com/feathersjs/feathers/issues/3106)) ([c2dbaaa](https://github.com/feathersjs/feathers/commit/c2dbaaa4d1d5a5675b5812a7ed2317076ac414fe)) - -# [5.0.0](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.38...v5.0.0) (2023-02-24) - -### Bug Fixes - -- **generators:** Fix typo in service client generator ([#3068](https://github.com/feathersjs/feathers/issues/3068)) ([612032e](https://github.com/feathersjs/feathers/commit/612032eced24ecbcf255d51ff0d537d74227cfd7)) - -# [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)) -- **schema:** Add schema helper for handling Object ids ([#3058](https://github.com/feathersjs/feathers/issues/3058)) ([1393bed](https://github.com/feathersjs/feathers/commit/1393bed81a9ee814de6aab0e537af83e667591a2)) - -# [5.0.0-pre.37](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.36...v5.0.0-pre.37) (2023-02-09) - -### Bug Fixes - -- **generators:** Add schema selection to CI test matrix ([#3035](https://github.com/feathersjs/feathers/issues/3035)) ([7484b16](https://github.com/feathersjs/feathers/commit/7484b164fba4ac2ee379dc5c6363f964f45e94d3)) -- **generators:** Fix Knex migration generated filename ([#3033](https://github.com/feathersjs/feathers/issues/3033)) ([1ac18a7](https://github.com/feathersjs/feathers/commit/1ac18a7143173d973af982772678834f7a7334f7)) -- **generators:** Generated app does not start when choosing JSON schema ([#3034](https://github.com/feathersjs/feathers/issues/3034)) ([7b8250b](https://github.com/feathersjs/feathers/commit/7b8250bd535c3c5ec7429a65139335ad43616ae0)) - -### Features - -- **mongodb:** Add Object ID keyword converter and update MongoDB CLI & docs ([#3041](https://github.com/feathersjs/feathers/issues/3041)) ([ca0994e](https://github.com/feathersjs/feathers/commit/ca0994eaecb5a31f310bc980d106834e11f24f41)) - -# [5.0.0-pre.36](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.35...v5.0.0-pre.36) (2023-01-29) - -### Bug Fixes - -- **generators:** Add main schema to all validators ([#2997](https://github.com/feathersjs/feathers/issues/2997)) ([5854dea](https://github.com/feathersjs/feathers/commit/5854dea7f610262121a49623ec5bbd474dcd3ef3)) -- **generators:** Add TypeScript as normal instead of dev dependency ([#3011](https://github.com/feathersjs/feathers/issues/3011)) ([2f67398](https://github.com/feathersjs/feathers/commit/2f673987f38b199e75aff629b7cdfcaebfd69c4c)) -- **generators:** Do not removeAdditional in queries ([#3000](https://github.com/feathersjs/feathers/issues/3000)) ([ef501bc](https://github.com/feathersjs/feathers/commit/ef501bcfa528119168787e9d857f1bb90e0c3114)) -- Update all dependencies ([#3024](https://github.com/feathersjs/feathers/issues/3024)) ([283dc47](https://github.com/feathersjs/feathers/commit/283dc4798d85584bc031e6e54b83b4ea77d1edd0)) - -### Features - -- **generators:** Add service file for shared information ([#3008](https://github.com/feathersjs/feathers/issues/3008)) ([0a1665d](https://github.com/feathersjs/feathers/commit/0a1665d23e002afadb40ed99bf0168f0fceb0054)) - -# [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)) diff --git a/packages/generators/README.md b/packages/generators/README.md deleted file mode 100644 index eca4bc0a6e..0000000000 --- a/packages/generators/README.md +++ /dev/null @@ -1,22 +0,0 @@ -# @feathersjs/generators - -[![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/generators.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/cli) - -> Feathers core code generators used by the CLI powered by [Pinion](https://github.com/feathershq/pinion/) - -## Installation - -``` -npm install @feathersjs/generators --save-dev -``` - -## Documentation - -Refer to the [Feathers CLI guide](https://feathersjs.com/guides/cli/) 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/generators/package.json b/packages/generators/package.json deleted file mode 100644 index 2d698681dc..0000000000 --- a/packages/generators/package.json +++ /dev/null @@ -1,96 +0,0 @@ -{ - "name": "@feathersjs/generators", - "version": "5.0.34", - "description": "Feathers CLI core generators, powered by Pinion", - "homepage": "https://feathersjs.com", - "keywords": [ - "feathers", - "pinion" - ], - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/daffl" - }, - "repository": { - "type": "git", - "url": "git://github.com/feathersjs/feathers.git", - "directory": "packages/commons" - }, - "author": { - "name": "Feathers contributor", - "email": "hello@feathersjs.com", - "url": "https://feathersjs.com" - }, - "contributors": [], - "bugs": { - "url": "https://github.com/feathersjs/feathers/issues" - }, - "engines": { - "node": ">= 16" - }, - "main": "lib/index.js", - "types": "lib/", - "type": "module", - "files": [ - "CHANGELOG.md", - "LICENSE", - "README.md", - "lib/**", - "*.d.ts", - "*.js" - ], - "scripts": { - "prepublish": "npm run compile", - "compile": "shx rm -rf lib/ && tsc", - "test": "npm run compile && mocha --config ../../.mocharc.json --require tsx --recursive test/**.test.ts test/**/*.test.ts" - }, - "directories": { - "lib": "lib" - }, - "publishConfig": { - "access": "public" - }, - "dependencies": { - "@featherscloud/pinion": "^0.5.5", - "chalk": "^5.4.1", - "lodash": "^4.17.21", - "prettier": "^3.6.2", - "typescript": "^5.9.2" - }, - "devDependencies": { - "@feathersjs/adapter-commons": "^5.0.34", - "@feathersjs/authentication": "^5.0.34", - "@feathersjs/authentication-client": "^5.0.34", - "@feathersjs/authentication-local": "^5.0.34", - "@feathersjs/authentication-oauth": "^5.0.34", - "@feathersjs/configuration": "^5.0.34", - "@feathersjs/errors": "^5.0.34", - "@feathersjs/express": "^5.0.34", - "@feathersjs/feathers": "^5.0.34", - "@feathersjs/knex": "^5.0.34", - "@feathersjs/koa": "^5.0.34", - "@feathersjs/mongodb": "^5.0.34", - "@feathersjs/rest-client": "^5.0.34", - "@feathersjs/schema": "^5.0.34", - "@feathersjs/socketio": "^5.0.34", - "@feathersjs/transport-commons": "^5.0.34", - "@feathersjs/typebox": "^5.0.34", - "@types/mocha": "^10.0.10", - "@types/node": "^24.1.0", - "@types/prettier": "^2.7.3", - "axios": "^1.11.0", - "knex": "^3.1.0", - "mocha": "^11.7.1", - "mongodb": "^6.18.0", - "mssql": "^11.0.1", - "mysql": "^2.18.1", - "pg": "^8.16.3", - "shx": "^0.4.0", - "sqlite3": "^5.1.7", - "tsx": "^4.20.3", - "type-fest": "^4.41.0", - "typescript": "^5.9.2" - }, - "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" -} diff --git a/packages/generators/src/app/index.ts b/packages/generators/src/app/index.ts deleted file mode 100644 index c004f8e3fd..0000000000 --- a/packages/generators/src/app/index.ts +++ /dev/null @@ -1,214 +0,0 @@ -import { sep, dirname } from 'path' -import chalk from 'chalk' -import { prompt, runGenerators } from '@featherscloud/pinion' -import { fileURLToPath } from 'url' -import { - FeathersBaseContext, - FeathersAppInfo, - initializeBaseContext, - addVersions, - install -} from '../commons.js' -import { generate as connectionGenerator, prompts as connectionPrompts } from '../connection/index.js' - -// Set __dirname in es module -const __dirname = dirname(fileURLToPath(import.meta.url)) - -export interface AppGeneratorData extends FeathersAppInfo { - /** - * The application name - */ - name: string - /** - * A short description of the app - */ - description: string - /** - * The database connection string - */ - connectionString: string - /** - * The source folder where files are put - */ - lib: string - /** - * Generate a client - */ - client: boolean -} - -export type AppGeneratorContext = FeathersBaseContext & - AppGeneratorData & { - dependencies: string[] - devDependencies: string[] - } - -export type AppGeneratorArguments = FeathersBaseContext & Partial - -export const generate = (ctx: AppGeneratorArguments) => - Promise.resolve(ctx) - .then(initializeBaseContext()) - .then((ctx) => ({ - ...ctx, - dependencies: [] as string[], - devDependencies: [] as string[] - })) - .then( - prompt((ctx) => [ - { - name: 'language', - type: 'list', - message: 'Do you want to use JavaScript or TypeScript?', - when: !ctx.language, - choices: [ - { name: 'TypeScript', value: 'ts' }, - { name: 'JavaScript', value: 'js' } - ] - }, - { - name: 'name', - type: 'input', - when: !ctx.name, - message: 'What is the name of your application?', - default: ctx.cwd.split(sep).pop(), - validate: (input) => { - if (ctx.dependencyVersions[input]) { - return `Application can not have the same name as a dependency` - } - - return true - } - }, - { - name: 'description', - type: 'input', - when: !ctx.description, - message: 'Write a short description' - }, - { - type: 'list', - name: 'framework', - when: !ctx.framework, - message: 'Which HTTP framework do you want to use?', - choices: [ - { value: 'koa', name: `KoaJS ${chalk.grey('(recommended)')}` }, - { value: 'express', name: 'Express' } - ] - }, - { - type: 'checkbox', - name: 'transports', - when: !ctx.transports, - message: 'What APIs do you want to offer?', - choices: [ - { value: 'rest', name: 'HTTP (REST)', checked: true }, - { value: 'websockets', name: 'Real-time', checked: true } - ] - }, - { - name: 'packager', - type: 'list', - when: !ctx.packager, - message: 'Which package manager are you using?', - choices: [ - { value: 'npm', name: 'npm' }, - { value: 'yarn', name: 'Yarn' }, - { value: 'pnpm', name: 'pnpm' } - ] - }, - { - name: 'client', - type: 'confirm', - when: ctx.client === undefined, - message: (answers) => `Generate ${answers.language === 'ts' ? 'end-to-end typed ' : ''}client?`, - suffix: chalk.grey(' Can be used with React, Angular, Vue, React Native, Node.js etc.') - }, - { - type: 'list', - name: 'schema', - when: !ctx.schema, - message: 'What is your preferred schema (model) definition format?', - suffix: chalk.grey( - ' Schemas allow to type, validate, secure and populate your data and configuration' - ), - choices: [ - { value: 'typebox', name: `TypeBox ${chalk.grey('(recommended)')}` }, - { value: 'json', name: 'JSON schema' }, - { value: false, name: `No schema ${chalk.grey('(not recommended)')}` } - ] - }, - ...connectionPrompts(ctx) - ]) - ) - .then(runGenerators(__dirname, 'templates')) - .then(initializeBaseContext()) - .then(async (ctx) => { - const { dependencies } = await connectionGenerator(ctx) - - return { - ...ctx, - dependencies - } - }) - .then( - install( - ({ transports, framework, dependencyVersions, dependencies, schema }) => { - const hasSocketio = transports.includes('websockets') - - dependencies.push( - '@feathersjs/feathers', - '@feathersjs/errors', - '@feathersjs/schema', - '@feathersjs/configuration', - '@feathersjs/transport-commons', - '@feathersjs/adapter-commons', - '@feathersjs/authentication', - '@feathersjs/authentication-client', - 'winston' - ) - - if (hasSocketio) { - dependencies.push('@feathersjs/socketio') - } - - if (framework === 'koa') { - dependencies.push('@feathersjs/koa') - } - - if (framework === 'express') { - dependencies.push('@feathersjs/express', 'compression') - } - - if (schema === 'typebox') { - dependencies.push('@feathersjs/typebox') - } - - return addVersions(dependencies, dependencyVersions) - }, - false, - ({ packager }) => packager - ) - ) - .then( - install( - ({ language, devDependencies, dependencyVersions }) => { - devDependencies.push( - 'nodemon', - 'axios', - 'mocha', - 'cross-env', - 'prettier', - '@feathersjs/cli', - '@feathersjs/rest-client' - ) - - if (language === 'ts') { - devDependencies.push('@types/mocha', '@types/node', 'nodemon', 'ts-node', 'typescript', 'shx') - } - - return addVersions(devDependencies, dependencyVersions) - }, - true, - ({ packager }) => packager - ) - ) diff --git a/packages/generators/src/app/templates/app.test.tpl.ts b/packages/generators/src/app/templates/app.test.tpl.ts deleted file mode 100644 index d0da71a985..0000000000 --- a/packages/generators/src/app/templates/app.test.tpl.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { toFile } from '@featherscloud/pinion' -import { renderSource } from '../../commons.js' -import { AppGeneratorContext } from '../index.js' - -const template = ({ - lib -}: AppGeneratorContext) => /* ts */ `// For more information about this file see https://dove.feathersjs.com/guides/cli/app.test.html -import assert from 'assert' -import axios from 'axios' -import type { Server } from 'http' -import { app } from '../${lib}/app' - -const port = app.get('port') -const appUrl = \`http://\${app.get('host')}:\${port}\` - -describe('Feathers application tests', () => { - let server: Server - - before(async () => { - server = await app.listen(port) - }) - - after(async () => { - await app.teardown() - }) - - it('starts and shows the index page', async () => { - const { data } = await axios.get(appUrl) - - assert.ok(data.indexOf('') !== -1) - }) - - it('shows a 404 JSON error', async () => { - try { - await axios.get(\`\${appUrl}/path/to/nowhere\`, { - responseType: 'json' - }) - assert.fail('should never get here') - } catch (error: any) { - const { response } = error - assert.strictEqual(response?.status, 404) - assert.strictEqual(response?.data?.code, 404) - assert.strictEqual(response?.data?.name, 'NotFound') - } - }) -}) -` - -export const generate = (ctx: AppGeneratorContext) => - Promise.resolve(ctx).then(renderSource(template, toFile('test', 'app.test'))) diff --git a/packages/generators/src/app/templates/app.tpl.ts b/packages/generators/src/app/templates/app.tpl.ts deleted file mode 100644 index a1c36a933b..0000000000 --- a/packages/generators/src/app/templates/app.tpl.ts +++ /dev/null @@ -1,141 +0,0 @@ -import { toFile } from '@featherscloud/pinion' -import { renderSource } from '../../commons.js' -import { AppGeneratorContext } from '../index.js' - -const tsKoaApp = ({ - transports, - schema -}: AppGeneratorContext) => /* ts */ `// For more information about this file see https://dove.feathersjs.com/guides/cli/application.html -import { feathers } from '@feathersjs/feathers' -import configuration from '@feathersjs/configuration' -import { - koa, rest, bodyParser, errorHandler, parseAuthentication, cors, serveStatic -} from '@feathersjs/koa' -${transports.includes('websockets') ? "import socketio from '@feathersjs/socketio'" : ''} - -${schema !== false ? `import { configurationValidator } from './configuration'` : ''} -import type { Application } from './declarations' -import { logError } from './hooks/log-error' -import { services } from './services/index' -${transports.includes('websockets') ? `import { channels } from './channels'` : ''} - -const app: Application = koa(feathers()) - -// Load our app configuration (see config/ folder) -app.configure(configuration(${schema !== false ? 'configurationValidator' : ''})) - -// Set up Koa middleware -app.use(cors()) -app.use(serveStatic(app.get('public'))) -app.use(errorHandler()) -app.use(parseAuthentication()) -app.use(bodyParser()) - -// Configure services and transports -app.configure(rest()) -${ - transports.includes('websockets') - ? `app.configure(socketio({ - cors: { - origin: app.get('origins') - } -}))` - : '' -} -app.configure(services) -${transports.includes('websockets') ? 'app.configure(channels)' : ''} - - -// Register hooks that run on all service methods -app.hooks({ - around: { - all: [ logError ] - }, - before: {}, - after: {}, - error: {} -}) -// Register application setup and teardown hooks here -app.hooks({ - setup: [], - teardown: [] -}) - -export { app } -` - -const tsExpressApp = ({ - transports, - schema -}: AppGeneratorContext) => /* ts */ `// For more information about this file see https://dove.feathersjs.com/guides/cli/application.html -import { feathers } from '@feathersjs/feathers' -import express, { - rest, json, urlencoded, cors, - serveStatic, notFound, errorHandler -} from '@feathersjs/express' -import configuration from '@feathersjs/configuration' -${transports.includes('websockets') ? "import socketio from '@feathersjs/socketio'" : ''} - -import type { Application } from './declarations' -${schema !== false ? `import { configurationValidator } from './configuration'` : ''} -import { logger } from './logger' -import { logError } from './hooks/log-error' -import { services } from './services/index' -${transports.includes('websockets') ? `import { channels } from './channels'` : ''} - -const app: Application = express(feathers()) - -// Load app configuration -app.configure(configuration(${schema !== false ? 'configurationValidator' : ''})) -app.use(cors()) -app.use(json()) -app.use(urlencoded({ extended: true })) -// Host the public folder -app.use('/', serveStatic(app.get('public'))) - -// Configure services and real-time functionality -app.configure(rest()) -${ - transports.includes('websockets') - ? `app.configure(socketio({ - cors: { - origin: app.get('origins') - } -}))` - : '' -} -app.configure(services) -${transports.includes('websockets') ? 'app.configure(channels)' : ''} - -// Configure a middleware for 404s and the error handler -app.use(notFound()) -app.use(errorHandler({ logger })) - -// Register hooks that run on all service methods -app.hooks({ - around: { - all: [ logError ] - }, - before: {}, - after: {}, - error: {} -}) -// Register application setup and teardown hooks here -app.hooks({ - setup: [], - teardown: [] -}) - -export { app } -` - -const template = (ctx: AppGeneratorContext) => - ctx.framework === 'express' ? tsExpressApp(ctx) : tsKoaApp(ctx) - -export const generate = (ctx: AppGeneratorContext) => - Promise.resolve(ctx).then( - renderSource( - template, - toFile(({ lib }) => lib, 'app') - ) - ) diff --git a/packages/generators/src/app/templates/channels.tpl.ts b/packages/generators/src/app/templates/channels.tpl.ts deleted file mode 100644 index 30d2aa7419..0000000000 --- a/packages/generators/src/app/templates/channels.tpl.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { toFile, when } from '@featherscloud/pinion' -import { renderSource } from '../../commons.js' -import { AppGeneratorContext } from '../index.js' - -const template = ({ - language -}: AppGeneratorContext) => /* ts */ `// For more information about this file see https://dove.feathersjs.com/guides/cli/channels.html -import type { RealTimeConnection, Params } from '@feathersjs/feathers' -import type { AuthenticationResult } from '@feathersjs/authentication' -import '@feathersjs/transport-commons' -import type { Application, HookContext } from './declarations' -import { logger } from './logger' - -export const channels = (app: Application) => { - logger.warn('Publishing all events to all authenticated users. See \`channels.${language}\` and https://dove.feathersjs.com/api/channels.html for more information.') - - app.on('connection', (connection: RealTimeConnection) => { - // On a new real-time connection, add it to the anonymous channel - app.channel('anonymous').join(connection) - }) - - app.on('login', (authResult: AuthenticationResult, { connection }: Params) => { - // connection can be undefined if there is no - // real-time connection, e.g. when logging in via REST - if(connection) { - // The connection is no longer anonymous, remove it - app.channel('anonymous').leave(connection) - - // Add it to the authenticated user channel - app.channel('authenticated').join(connection) - } - }) - - // eslint-disable-next-line no-unused-vars - app.publish((data: any, context: HookContext) => { - // Here you can add event publishers to channels set up in \`channels.js\` - // To publish only for a specific event use \`app.publish(eventname, () => {})\` - - // e.g. to publish all service events to all authenticated users use - return app.channel('authenticated') - }) -} -` - -export const generate = (ctx: AppGeneratorContext) => - Promise.resolve(ctx).then( - when( - ({ transports }) => transports.includes('websockets'), - renderSource( - template, - toFile(({ lib }) => lib, 'channels') - ) - ) - ) diff --git a/packages/generators/src/app/templates/client.test.tpl.ts b/packages/generators/src/app/templates/client.test.tpl.ts deleted file mode 100644 index 062156d2d1..0000000000 --- a/packages/generators/src/app/templates/client.test.tpl.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { toFile, when } from '@featherscloud/pinion' -import { renderSource } from '../../commons.js' -import { AppGeneratorContext } from '../index.js' - -const template = ({ lib }: AppGeneratorContext) => /* ts */ `import assert from 'assert' -import axios from 'axios' -import type { Server } from 'http' -import { app } from '../${lib}/app' -import { createClient } from '../${lib}/client' - -import rest from '@feathersjs/rest-client' - -const port = app.get('port') -const appUrl = \`http://\${app.get('host')}:\${port}\` - -describe('client tests', () => { - const client = createClient(rest(appUrl).axios(axios)) - - it('initialized the client', () => { - assert.ok(client) - }) -}) -` - -export const generate = (ctx: AppGeneratorContext) => - Promise.resolve(ctx).then( - when((ctx) => ctx.client, renderSource(template, toFile('test', 'client.test'))) - ) diff --git a/packages/generators/src/app/templates/client.tpl.ts b/packages/generators/src/app/templates/client.tpl.ts deleted file mode 100644 index 101c617aa8..0000000000 --- a/packages/generators/src/app/templates/client.tpl.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { toFile, when } from '@featherscloud/pinion' -import { renderSource } from '../../commons.js' -import { AppGeneratorContext } from '../index.js' - -const template = ({ - name, - language -}: AppGeneratorContext) => /* ts */ `// For more information about this file see https://dove.feathersjs.com/guides/cli/client.html -import { feathers } from '@feathersjs/feathers' -import type { TransportConnection, Application } from '@feathersjs/feathers' -import authenticationClient from '@feathersjs/authentication-client' -import type { AuthenticationClientOptions } from '@feathersjs/authentication-client' - -export interface Configuration { - connection: TransportConnection -} - -export interface ServiceTypes {} - -export type ClientApplication = Application - -/** - * Returns a ${language === 'ts' ? 'typed' : ''} client for the ${name} app. - * - * @param connection The REST or Socket.io Feathers client connection - * @param authenticationOptions Additional settings for the authentication client - * @see https://dove.feathersjs.com/api/client.html - * @returns The Feathers client application - */ -export const createClient = ( - connection: TransportConnection, - authenticationOptions: Partial = {} -) => { - const client: ClientApplication = feathers() - - client.configure(connection) - client.configure(authenticationClient(authenticationOptions)) - client.set('connection', connection) - - return client -} -` - -export const generate = async (ctx: AppGeneratorContext) => - Promise.resolve(ctx).then( - when( - (ctx) => ctx.client, - renderSource( - template, - toFile(({ lib }) => lib, 'client') - ) - ) - ) diff --git a/packages/generators/src/app/templates/configuration.tpl.ts b/packages/generators/src/app/templates/configuration.tpl.ts deleted file mode 100644 index 85eed1dd49..0000000000 --- a/packages/generators/src/app/templates/configuration.tpl.ts +++ /dev/null @@ -1,89 +0,0 @@ -import { toFile, when, writeJSON } from '@featherscloud/pinion' -import { renderSource } from '../../commons.js' -import { AppGeneratorContext } from '../index.js' - -const defaultConfig = ({}: AppGeneratorContext) => ({ - host: 'localhost', - port: 3030, - public: './public/', - origins: ['http://localhost:3030'], - paginate: { - default: 10, - max: 50 - } -}) - -const customEnvironment = { - port: { - __name: 'PORT', - __format: 'number' - }, - host: 'HOSTNAME', - authentication: { - secret: 'FEATHERS_SECRET' - } -} - -const testConfig = { - port: 8998 -} - -const configurationJsonTemplate = - ({}: AppGeneratorContext) => `import { defaultAppSettings, getValidator } from '@feathersjs/schema' -import type { FromSchema } from '@feathersjs/schema' - -import { dataValidator } from './validators' - -export const configurationSchema = { - $id: 'configuration', - type: 'object', - additionalProperties: false, - required: [ 'host', 'port', 'public' ], - properties: { - ...defaultAppSettings, - host: { type: 'string' }, - port: { type: 'number' }, - public: { type: 'string' } - } -} as const - -export const configurationValidator = getValidator(configurationSchema, dataValidator) - -export type ApplicationConfiguration = FromSchema -` - -const configurationTypeboxTemplate = - ({}: AppGeneratorContext) => `import { Type, getValidator, defaultAppConfiguration } from '@feathersjs/typebox' -import type { Static } from '@feathersjs/typebox' - -import { dataValidator } from './validators' - -export const configurationSchema = Type.Intersect([ - defaultAppConfiguration, - Type.Object({ - host: Type.String(), - port: Type.Number(), - public: Type.String() - }) -]) - -export type ApplicationConfiguration = Static - -export const configurationValidator = getValidator(configurationSchema, dataValidator) -` - -export const generate = (ctx: AppGeneratorContext) => - Promise.resolve(ctx) - .then(writeJSON(defaultConfig, toFile('config', 'default.json'))) - .then(writeJSON(testConfig, toFile('config', 'test.json'))) - .then(writeJSON(customEnvironment, toFile('config', 'custom-environment-variables.json'))) - .then( - when( - (ctx) => ctx.schema !== false, - renderSource( - async (ctx) => - ctx.schema === 'typebox' ? configurationTypeboxTemplate(ctx) : configurationJsonTemplate(ctx), - toFile(({ lib }) => lib, 'configuration') - ) - ) - ) diff --git a/packages/generators/src/app/templates/declarations.tpl.ts b/packages/generators/src/app/templates/declarations.tpl.ts deleted file mode 100644 index 5224842e5e..0000000000 --- a/packages/generators/src/app/templates/declarations.tpl.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { toFile, when, renderTemplate } from '@featherscloud/pinion' -import { AppGeneratorContext } from '../index.js' - -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}' -${ - schema === false - ? `type ApplicationConfiguration = any` - : `import { ApplicationConfiguration } from './configuration'` -} - -export type { NextFunction } - -// The types for app.get(name) and app.set(name) -// eslint-disable-next-line @typescript-eslint/no-empty-interface -export interface Configuration extends ApplicationConfiguration {} - -// A mapping of service names to types. Will be extended in service files. -// eslint-disable-next-line @typescript-eslint/no-empty-interface -export interface ServiceTypes {} - -// The application instance type that will be used everywhere else -export type Application = FeathersApplication - -// The context for hook functions - can be typed with a service class -export type HookContext = FeathersHookContext -` - -export const generate = (ctx: AppGeneratorContext) => - Promise.resolve(ctx).then( - when( - ({ language }) => language === 'ts', - renderTemplate( - template, - toFile(({ lib }) => lib, 'declarations.ts') - ) - ) - ) diff --git a/packages/generators/src/app/templates/gitignore.tpl.ts b/packages/generators/src/app/templates/gitignore.tpl.ts deleted file mode 100644 index 03aed1b74c..0000000000 --- a/packages/generators/src/app/templates/gitignore.tpl.ts +++ /dev/null @@ -1,128 +0,0 @@ -import { renderTemplate, toFile } from '@featherscloud/pinion' -import { AppGeneratorContext } from '..' - -const template = `# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -lerna-debug.log* -.pnpm-debug.log* - -# Diagnostic reports (https://nodejs.org/api/report.html) -report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json - -# Runtime data -pids -*.pid -*.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage -*.lcov - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Bower dependency directory (https://bower.io/) -bower_components - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (https://nodejs.org/api/addons.html) -build/Release - -# Dependency directories -node_modules/ -jspm_packages/ - -# Snowpack dependency directory (https://snowpack.dev/) -web_modules/ - -# TypeScript cache -*.tsbuildinfo - -# Optional npm cache directory -.npm - -# Optional eslint cache -.eslintcache - -# Microbundle cache -.rpt2_cache/ -.rts2_cache_cjs/ -.rts2_cache_es/ -.rts2_cache_umd/ - -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' -*.tgz - -# Yarn Integrity file -.yarn-integrity - -# dotenv environment variables file -.env -.env.test -.env.production - -# parcel-bundler cache (https://parceljs.org/) -.cache -.parcel-cache - -# Next.js build output -.next -out - -# Nuxt.js build / generate output -.nuxt -dist - -# Gatsby files -.cache/ -# Comment in the public line in if your project uses Gatsby and not Next.js -# https://nextjs.org/blog/next-9-1#public-directory-support -# public - -# vuepress build output -.vuepress/dist - -# Serverless directories -.serverless/ - -# FuseBox cache -.fusebox/ - -# DynamoDB Local files -.dynamodb/ - -# TernJS port file -.tern-port - -# Stores VSCode versions used for testing VSCode extensions -.vscode-test - -# yarn v2 -.yarn/cache -.yarn/unplugged -.yarn/build-state.yml -.yarn/install-state.gz -.pnp.* -.sqlite - -lib/ -` - -export const generate = (ctx: AppGeneratorContext) => - Promise.resolve(ctx).then(renderTemplate(template, toFile('.gitignore'))) diff --git a/packages/generators/src/app/templates/index.html.tpl.ts b/packages/generators/src/app/templates/index.html.tpl.ts deleted file mode 100644 index 9369e7fe08..0000000000 --- a/packages/generators/src/app/templates/index.html.tpl.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { renderTemplate, toFile } from '@featherscloud/pinion' -import { AppGeneratorContext } from '../index.js' - -const template = ({ name, description }: AppGeneratorContext) => /* html */ ` - - - ${name} - - - - - - - - - -` - -export const generate = (ctx: AppGeneratorContext) => - Promise.resolve(ctx).then(renderTemplate(template, toFile('public', 'index.html'))) diff --git a/packages/generators/src/app/templates/index.tpl.ts b/packages/generators/src/app/templates/index.tpl.ts deleted file mode 100644 index db82b0d154..0000000000 --- a/packages/generators/src/app/templates/index.tpl.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { toFile } from '@featherscloud/pinion' -import { renderSource } from '../../commons.js' -import { AppGeneratorContext } from '../index.js' - -const template = ({}: AppGeneratorContext) => /* ts */ `import { app } from './app' -import { logger } from './logger' - -const port = app.get('port') -const host = app.get('host') - -process.on('unhandledRejection', (reason) => - logger.error('Unhandled Rejection %O', reason) -) - -app.listen(port).then(() => { - logger.info(\`Feathers app listening on http://\${host}:\${port}\`) -}) -` - -export const generate = (ctx: AppGeneratorContext) => - Promise.resolve(ctx).then( - renderSource( - template, - toFile(({ lib }) => lib, 'index') - ) - ) diff --git a/packages/generators/src/app/templates/logger.tpl.ts b/packages/generators/src/app/templates/logger.tpl.ts deleted file mode 100644 index 0f72ef9d8a..0000000000 --- a/packages/generators/src/app/templates/logger.tpl.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { toFile } from '@featherscloud/pinion' -import { renderSource } from '../../commons.js' -import { AppGeneratorContext } from '../index.js' - -const template = - ({}: AppGeneratorContext) => /* ts */ `// For more information about this file see https://dove.feathersjs.com/guides/cli/logging.html -import { createLogger, format, transports } from 'winston' - -// Configure the Winston logger. For the complete documentation see https://github.com/winstonjs/winston -export const logger = createLogger({ - // To see more detailed errors, change this to 'debug' - level: 'info', - format: format.combine( - format.splat(), - format.simple() - ), - transports: [ - new transports.Console() - ] -}) -` - -export const logErrorTemplate = /* ts */ `// For more information about this file see https://dove.feathersjs.com/guides/cli/log-error.html -import type { HookContext, NextFunction } from '../declarations' -import { logger } from '../logger' - -export const logError = async (context: HookContext, next: NextFunction) => { - try { - await next() - } catch (error: any) { - logger.error(error.stack) - - // Log validation errors - if (error.data) { - logger.error('Data: %O', error.data) - } - - throw error - } -} -` - -export const generate = (ctx: AppGeneratorContext) => - Promise.resolve(ctx) - .then( - renderSource( - template, - toFile(({ lib }) => lib, 'logger') - ) - ) - .then( - renderSource( - logErrorTemplate, - toFile(({ lib }) => lib, 'hooks', 'log-error') - ) - ) diff --git a/packages/generators/src/app/templates/package.json.tpl.ts b/packages/generators/src/app/templates/package.json.tpl.ts deleted file mode 100644 index 9717859a94..0000000000 --- a/packages/generators/src/app/templates/package.json.tpl.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { toFile, writeJSON } from '@featherscloud/pinion' -import { AppGeneratorContext } from '../index.js' - -const jsPackageJson = (lib: string) => ({ - type: 'module', - scripts: { - start: `node ${lib}`, - dev: `nodemon ${lib}/`, - prettier: 'npx prettier "**/*.js" --write', - mocha: 'cross-env NODE_ENV=test mocha test/ --recursive --exit', - test: 'npm run mocha', - 'bundle:client': 'npm pack --pack-destination ./public' - } -}) - -const tsPackageJson = (lib: string) => ({ - scripts: { - dev: `nodemon -x ts-node ${lib}/index.ts`, - compile: 'shx rm -rf lib/ && tsc', - start: 'node lib/', - prettier: 'npx prettier "**/*.ts" --write', - mocha: - 'cross-env NODE_ENV=test mocha test/ --require ts-node/register --recursive --extension .ts --exit', - test: 'npm run mocha', - 'bundle:client': 'npm run compile && npm pack --pack-destination ./public' - } -}) - -const packageJson = ({ - name, - description, - client, - language, - packager, - database, - framework, - transports, - lib, - test, - schema -}: AppGeneratorContext) => ({ - name, - description, - version: '0.0.0', - homepage: '', - private: true, - keywords: ['feathers'], - author: {}, - contributors: [] as string[], - bugs: {}, - engines: { - node: `>= ${process.version.substring(1)}` - }, - feathers: { - language, - packager, - database, - framework, - transports, - schema - }, - directories: { - lib, - test - }, - ...(client - ? { - files: ['lib/client.js', 'lib/**/*.d.ts', 'lib/**/*.shared.js'], - main: language === 'ts' ? 'lib/client' : `${lib}/client` - } - : { - main: 'lib/index' - }), - ...(language === 'ts' ? tsPackageJson(lib) : jsPackageJson(lib)) -}) - -export const generate = (ctx: AppGeneratorContext) => - Promise.resolve(ctx).then(writeJSON(packageJson, toFile('package.json'))) diff --git a/packages/generators/src/app/templates/prettierrc.tpl.ts b/packages/generators/src/app/templates/prettierrc.tpl.ts deleted file mode 100644 index a9805ce09c..0000000000 --- a/packages/generators/src/app/templates/prettierrc.tpl.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { toFile, writeJSON } from '@featherscloud/pinion' -import { AppGeneratorContext } from '../index.js' -import { PRETTIERRC } from '../../commons.js' - -export const generate = (ctx: AppGeneratorContext) => - Promise.resolve(ctx).then( - writeJSON( - (ctx) => ({ - ...PRETTIERRC, - parser: ctx.language === 'ts' ? 'typescript' : 'babel' - }), - toFile('.prettierrc') - ) - ) diff --git a/packages/generators/src/app/templates/readme.md.tpl.ts b/packages/generators/src/app/templates/readme.md.tpl.ts deleted file mode 100644 index f691952a4a..0000000000 --- a/packages/generators/src/app/templates/readme.md.tpl.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { renderTemplate, toFile } from '@featherscloud/pinion' -import { AppGeneratorContext } from '../index.js' - -const template = ({ name, description, language, database }: AppGeneratorContext) => /* md */ `# ${name} - -> ${description} - -## About - -This project uses [Feathers](http://feathersjs.com). An open source framework for building APIs and real-time applications. - -## Getting Started - -1. Make sure you have [NodeJS](https://nodejs.org/) and [npm](https://www.npmjs.com/) installed. -2. Install your dependencies - - \`\`\` - cd path/to/${name} - npm install - \`\`\` - -3. Start your app - - \`\`\`${ - language === 'ts' - ? ` - npm run compile # Compile TypeScript source` - : '' - }${ - database !== 'mongodb' - ? ` - npm run migrate # Run migrations to set up the database` - : '' - } - npm start - \`\`\` - -## Testing - -Run \`npm test\` and all your tests in the \`test/\` directory will be run. - -## Scaffolding - -This app comes with a powerful command line interface for Feathers. Here are a few things it can do: - -\`\`\` -$ npx feathers help # Show all commands -$ npx feathers generate service # Generate a new Service -\`\`\` - -## Help - -For more information on all the things you can do with Feathers visit [docs.feathersjs.com](http://docs.feathersjs.com). -` - -export const generate = (ctx: AppGeneratorContext) => - Promise.resolve(ctx).then(renderTemplate(template, toFile('readme.md'))) diff --git a/packages/generators/src/app/templates/services.tpl.ts b/packages/generators/src/app/templates/services.tpl.ts deleted file mode 100644 index 6e0d8a4718..0000000000 --- a/packages/generators/src/app/templates/services.tpl.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { toFile } from '@featherscloud/pinion' -import { renderSource } from '../../commons.js' -import { AppGeneratorContext } from '../index.js' - -const template = - ({}: AppGeneratorContext) => /* ts */ `// For more information about this file see https://dove.feathersjs.com/guides/cli/application.html#configure-functions -import type { Application } from '../declarations' - -export const services = (app: Application) => { - // All services will be registered here -} -` - -export const generate = (ctx: AppGeneratorContext) => - Promise.resolve(ctx).then( - renderSource( - template, - toFile(({ lib }) => lib, 'services', 'index') - ) - ) diff --git a/packages/generators/src/app/templates/tsconfig.json.tpl.ts b/packages/generators/src/app/templates/tsconfig.json.tpl.ts deleted file mode 100644 index 72cf2af85c..0000000000 --- a/packages/generators/src/app/templates/tsconfig.json.tpl.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { toFile, when, writeJSON } from '@featherscloud/pinion' -import { AppGeneratorContext } from '../index.js' - -export const generate = (ctx: AppGeneratorContext) => - Promise.resolve(ctx).then( - when( - (ctx) => ctx.language === 'ts', - writeJSON( - ({ lib }) => ({ - 'ts-node': { - files: true - }, - compilerOptions: { - target: 'es2020', - module: 'commonjs', - outDir: './lib', - rootDir: `./${lib}`, - declaration: true, - strict: true, - esModuleInterop: true, - sourceMap: true - }, - include: [lib], - exclude: ['test'] - }), - toFile('tsconfig.json') - ) - ) - ) diff --git a/packages/generators/src/app/templates/validators.tpl.ts b/packages/generators/src/app/templates/validators.tpl.ts deleted file mode 100644 index 2647cdaf09..0000000000 --- a/packages/generators/src/app/templates/validators.tpl.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { toFile } from '@featherscloud/pinion' -import { renderSource } from '../../commons.js' -import { AppGeneratorContext } from '../index.js' - -const validatorTemplate = /* ts */ `// For more information about this file see https://dove.feathersjs.com/guides/cli/validators.html -import { Ajv, addFormats } from '@feathersjs/schema' -import type { FormatsPluginOptions } from '@feathersjs/schema' - -const formats: FormatsPluginOptions = [ - 'date-time', - 'time', - 'date', - 'email', - 'hostname', - 'ipv4', - 'ipv6', - 'uri', - 'uri-reference', - 'uuid', - 'uri-template', - 'json-pointer', - 'relative-json-pointer', - 'regex' -] - -export const dataValidator: Ajv = addFormats(new Ajv({}), formats) - -export const queryValidator: Ajv = addFormats(new Ajv({ - coerceTypes: true -}), formats) -` - -export const generate = (ctx: AppGeneratorContext) => - Promise.resolve(ctx).then( - renderSource( - validatorTemplate, - toFile(({ lib }) => lib, 'validators') - ) - ) diff --git a/packages/generators/src/authentication/index.ts b/packages/generators/src/authentication/index.ts deleted file mode 100644 index 12cea73aa2..0000000000 --- a/packages/generators/src/authentication/index.ts +++ /dev/null @@ -1,119 +0,0 @@ -import chalk from 'chalk' -import { dirname } from 'path' -import { runGenerators, prompt } from '@featherscloud/pinion' -import { fileURLToPath } from 'url' -import { - addVersions, - checkPreconditions, - FeathersBaseContext, - initializeBaseContext, - install -} from '../commons.js' -import { generate as serviceGenerator, ServiceGeneratorContext } from '../service/index.js' - -// Set __dirname in es module -const __dirname = dirname(fileURLToPath(import.meta.url)) - -export interface AuthenticationGeneratorContext extends ServiceGeneratorContext { - service: string - entity: string - authStrategies: string[] - dependencies: string[] -} - -export type AuthenticationGeneratorArguments = FeathersBaseContext & - Partial> - -export const generate = (ctx: AuthenticationGeneratorArguments) => - Promise.resolve(ctx) - .then(initializeBaseContext()) - .then(checkPreconditions()) - .then( - prompt((ctx: AuthenticationGeneratorArguments) => [ - { - type: 'checkbox', - name: 'authStrategies', - when: !ctx.authStrategies, - message: 'Which authentication methods do you want to use?', - suffix: chalk.grey(' Other methods and providers can be added at any time.'), - choices: [ - { - name: 'Email + Password', - value: 'local', - checked: true - }, - { - name: 'Google', - value: 'google' - }, - { - name: 'Facebook', - value: 'facebook' - }, - { - name: 'Twitter', - value: 'twitter' - }, - { - name: 'GitHub', - value: 'github' - }, - { - name: 'Auth0', - value: 'auth0' - } - ] - }, - { - name: 'service', - type: 'input', - when: !ctx.service, - message: 'What is your authentication service name?', - default: 'user' - }, - { - name: 'path', - type: 'input', - when: !ctx.path, - message: 'What path should the service be registered on?', - default: 'users' - } - ]) - ) - .then(async (ctx) => { - const serviceContext = await serviceGenerator({ - ...ctx, - name: ctx.service, - isEntityService: true - }) - - return { - ...ctx, - entity: ctx.service, - ...serviceContext - } - }) - .then(runGenerators(__dirname, 'templates')) - .then((ctx) => ctx as AuthenticationGeneratorContext) - .then((ctx) => { - const dependencies: string[] = [] - - dependencies.push('@feathersjs/authentication-oauth') - - if (ctx.authStrategies.includes('local')) { - dependencies.push('@feathersjs/authentication-local') - } - - if (ctx.dependencies) { - return { - ...ctx, - dependencies: [...ctx.dependencies, ...dependencies] - } - } - - return install( - addVersions(dependencies, ctx.dependencyVersions), - false, - ctx.feathers.packager - )(ctx) - }) diff --git a/packages/generators/src/authentication/templates/authentication.tpl.ts b/packages/generators/src/authentication/templates/authentication.tpl.ts deleted file mode 100644 index 304f8d5f0e..0000000000 --- a/packages/generators/src/authentication/templates/authentication.tpl.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { before, toFile } from '@featherscloud/pinion' -import { injectSource, renderSource } from '../../commons.js' -import { AuthenticationGeneratorContext } from '../index.js' -import { localTemplate, oauthTemplate } from '../../commons.js' - -const template = ({ - authStrategies -}: AuthenticationGeneratorContext) => /* ts */ `// For more information about this file see https://dove.feathersjs.com/guides/cli/authentication.html -import { AuthenticationService, JWTStrategy } from '@feathersjs/authentication' -${localTemplate(authStrategies, `import { LocalStrategy } from '@feathersjs/authentication-local'`)} -${oauthTemplate(authStrategies, `import { oauth, OAuthStrategy } from '@feathersjs/authentication-oauth'`)} - -import type { Application } from './declarations' - -declare module './declarations' { - interface ServiceTypes { - 'authentication': AuthenticationService - } -} - -export const authentication = (app: Application) => { - const authentication = new AuthenticationService(app) - - authentication.register('jwt', new JWTStrategy()) - ${authStrategies - .map( - (strategy) => - ` authentication.register('${strategy}', ${ - strategy === 'local' ? `new LocalStrategy()` : `new OAuthStrategy()` - })` - ) - .join('\n')} - - app.use('authentication', authentication) - ${oauthTemplate(authStrategies, `app.configure(oauth())`)} -} -` - -const importTemplate = "import { authentication } from './authentication'" -const configureTemplate = 'app.configure(authentication)' -const toAppFile = toFile(({ lib }) => [lib, 'app']) - -export const generate = (ctx: AuthenticationGeneratorContext) => - Promise.resolve(ctx) - .then( - renderSource( - template, - toFile(({ lib }) => lib, 'authentication') - ) - ) - .then(injectSource(importTemplate, before('import { services } from'), toAppFile)) - .then(injectSource(configureTemplate, before('app.configure(services)'), toAppFile)) diff --git a/packages/generators/src/authentication/templates/client.test.tpl.ts b/packages/generators/src/authentication/templates/client.test.tpl.ts deleted file mode 100644 index 7b4e648faa..0000000000 --- a/packages/generators/src/authentication/templates/client.test.tpl.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { toFile, when } from '@featherscloud/pinion' -import { fileExists, renderSource } from '../../commons.js' -import { AuthenticationGeneratorContext } from '../index.js' -import { localTemplate } from '../../commons.js' - -const template = ({ - authStrategies, - upperName, - type, - lib -}: AuthenticationGeneratorContext) => /* ts */ `// For more information about this file see https://dove.feathersjs.com/guides/cli/client.test.html -import assert from 'assert' -import axios from 'axios' - -import rest from '@feathersjs/rest-client' -${localTemplate(authStrategies, `import authenticationClient from '@feathersjs/authentication-client'`)} -import { app } from '../${lib}/app' -import { createClient } from '../${lib}/client' -${localTemplate(authStrategies, `import type { ${upperName}Data } from '../${lib}/client'`)} - -const port = app.get('port') -const appUrl = \`http://\${app.get('host')}:\${port}\` - -describe('application client tests', () => { - const client = createClient(rest(appUrl).axios(axios)) - - before(async () => { - await app.listen(port) - }) - - after(async () => { - await app.teardown() - }) - - it('initialized the client', () => { - assert.ok(client) - }) - - ${localTemplate( - authStrategies, - ` - it('creates and authenticates a user with email and password', async () => { - const userData: ${upperName}Data = { - email: 'someone@example.com', - password: 'supersecret' - } - - await client.service('users').create(userData) - - const { user, accessToken } = await client.authenticate({ - strategy: 'local', - ...userData - }) - - assert.ok(accessToken, 'Created access token for user') - assert.ok(user, 'Includes user in authentication data') - assert.strictEqual(user.password, undefined, 'Password is hidden to clients') - - await client.logout() - - // Remove the test user on the server - await app.service('users').remove(user.${type === 'mongodb' ? '_id' : 'id'}) - })` - )} -}) -` - -export const generate = (ctx: AuthenticationGeneratorContext) => - Promise.resolve(ctx).then( - when( - ({ lib, language }) => fileExists(lib, `client.${language}`), - renderSource( - template, - toFile(({ test }) => test, 'client.test'), - { force: true } - ) - ) - ) diff --git a/packages/generators/src/authentication/templates/config.tpl.ts b/packages/generators/src/authentication/templates/config.tpl.ts deleted file mode 100644 index 2fdbaf3eab..0000000000 --- a/packages/generators/src/authentication/templates/config.tpl.ts +++ /dev/null @@ -1,60 +0,0 @@ -import crypto from 'crypto' -import { toFile, mergeJSON } from '@featherscloud/pinion' -import { AuthenticationGeneratorContext } from '../index.js' - -export const generate = (ctx: AuthenticationGeneratorContext) => - Promise.resolve(ctx) - .then( - mergeJSON( - ({ authStrategies }) => { - const authentication: any = { - entity: ctx.entity, - service: ctx.path, - secret: crypto.randomBytes(24).toString('base64'), - authStrategies: ['jwt'], - jwtOptions: { - header: { - typ: 'access' - }, - audience: 'https://yourdomain.com', - algorithm: 'HS256', - expiresIn: '1d' - } - } - - if (authStrategies.includes('local')) { - authentication.authStrategies.push('local') - authentication.local = { - usernameField: 'email', - passwordField: 'password' - } - } - - const oauthStrategies = authStrategies.filter((name) => name !== 'local') - - if (oauthStrategies.length) { - authentication.oauth = oauthStrategies.reduce((oauth, name) => { - oauth[name] = { - key: '', - secret: '' - } - - return oauth - }, {} as any) - } - - return { authentication } - }, - toFile('config', 'default.json') - ) - ) - .then( - mergeJSON( - { - authentication: { - secret: 'FEATHERS_SECRET' - } - }, - toFile('config', 'custom-environment-variables.json') - ) - ) diff --git a/packages/generators/src/authentication/templates/declarations.tpl.ts b/packages/generators/src/authentication/templates/declarations.tpl.ts deleted file mode 100644 index b9a264bb1f..0000000000 --- a/packages/generators/src/authentication/templates/declarations.tpl.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { inject, before, toFile, when, append } from '@featherscloud/pinion' -import { AuthenticationGeneratorContext } from '../index.js' - -const importTemplate = ({ - upperName, - folder, - fileName -}: AuthenticationGeneratorContext) => /* ts */ `import { ${upperName} } from './services/${folder.join( - '/' -)}/${fileName}' -` - -const paramsTemplate = ({ - entity, - upperName -}: AuthenticationGeneratorContext) => /* ts */ `// Add the ${entity} as an optional property to all params -declare module '@feathersjs/feathers' { - interface Params { - ${entity}?: ${upperName} - } -} -` - -const toDeclarationFile = toFile(({ lib }) => lib, 'declarations.ts') - -export const generate = (ctx: AuthenticationGeneratorContext) => - Promise.resolve(ctx) - .then( - when( - (ctx) => ctx.language === 'ts', - inject( - importTemplate, - before(/export \{ NextFunction \}|export type \{ NextFunction \}/), - toDeclarationFile - ) - ) - ) - .then(when((ctx) => ctx.language === 'ts', inject(paramsTemplate, append(), toDeclarationFile))) diff --git a/packages/generators/src/commons.ts b/packages/generators/src/commons.ts deleted file mode 100644 index 0791333021..0000000000 --- a/packages/generators/src/commons.ts +++ /dev/null @@ -1,378 +0,0 @@ -import fs from 'fs' -import { join, dirname } from 'path' -import { PackageJson } from 'type-fest' -import { readFile, writeFile } from 'fs/promises' -import { - Callable, - PinionContext, - loadJSON, - fromFile, - getCallable, - renderTemplate, - inject, - Location, - exec -} from '@featherscloud/pinion' -import ts from 'typescript' -import prettier, { Options as PrettierOptions } from 'prettier' -import path from 'path' -import { fileURLToPath } from 'url' - -// Set __dirname in es module -const __dirname = dirname(fileURLToPath(import.meta.url)) - -export const { version } = JSON.parse(fs.readFileSync(join(__dirname, '..', 'package.json')).toString()) - -export type DependencyVersions = { [key: string]: string } - -export const DATABASE_TYPES = ['mongodb', 'mysql', 'postgresql', 'sqlite', 'mssql', 'other'] as const - -/** - * The database types supported by this generator - */ -export type DatabaseType = (typeof DATABASE_TYPES)[number] - -/** - * Returns the name of the Feathers database adapter for a supported database type - * - * @param database The type of the database - * @returns The name of the adapter - */ -export const getDatabaseAdapter = (database: DatabaseType) => (database === 'mongodb' ? 'mongodb' : 'knex') - -export type FeathersAppInfo = { - /** - * The application language - */ - language: 'ts' | 'js' - /** - * The main database - */ - database: DatabaseType - /** - * The package manager used - */ - packager: 'yarn' | 'npm' | 'pnpm' - /** - * A list of all chosen transports - */ - transports: ('rest' | 'websockets')[] - /** - * The HTTP framework used - */ - framework: 'koa' | 'express' - /** - * The main schema definition format - */ - schema: 'typebox' | 'json' | false -} - -export interface AppPackageJson extends PackageJson { - feathers?: FeathersAppInfo -} - -export interface FeathersBaseContext extends PinionContext { - /** - * Information about the Feathers application (like chosen language, database etc.) - * usually taken from `package.json` - */ - feathers: FeathersAppInfo - /** - * The package.json file - */ - pkg: AppPackageJson - /** - * The folder where source files are put - */ - lib: string - /** - * The folder where test files are put - */ - test: string - /** - * The language the app is generated in - */ - language: 'js' | 'ts' - /** - * A list dependencies that should be installed with a certain version. - * Used for installing development dependencies during testing. - */ - dependencyVersions?: DependencyVersions -} - -/** - * Returns dependencies with the versions from the context attached (if available) - * - * @param dependencies The dependencies to install - * @param versions The dependency version list - * @returns A list of dependencies with their versions - */ -export const addVersions = ( - dependencies: string[], - versions: DependencyVersions, - defaultVersion = 'latest' -): string[] => dependencies.map((dep) => `${dep}@${versions[dep] || defaultVersion}`) - -/** - * Loads the application package.json and populates information like the library and test directory - * and Feathers app specific information. - * - * @returns The updated context - */ -export const initializeBaseContext = - () => - (ctx: C) => - Promise.resolve(ctx) - .then(loadJSON(fromFile('package.json'), (pkg) => ({ pkg }), {})) - .then( - loadJSON(path.join(__dirname, '..', 'package.json'), (pkg: PackageJson) => ({ - dependencyVersions: { - ...pkg.devDependencies, - ...ctx.dependencyVersions, - '@feathersjs/cli': version - } - })) - ) - .then((ctx) => ({ - ...ctx, - lib: ctx.pkg?.directories?.lib || 'src', - test: ctx.pkg?.directories?.test || 'test', - language: ctx.language || ctx.pkg?.feathers?.language, - feathers: ctx.pkg?.feathers - })) - -/** - * A special error that can be thrown by generators. It contains additional - * information about the error that can be used to display a more helpful - * error message to the user. - */ -export class FeathersGeneratorError extends Error { - /** - * Additional information about the error. This can include things like - * the reason for the error and suggested actions to take. - */ - context?: Record - - /** - * Creates a new FeathersGeneratorError - * @param message The error message - * @param context Additional information about the error - */ - constructor(message: string, context?: Record) { - super(message) - this.name = 'FeathersGeneratorError' - this.context = context - } -} - -/** - * Checks if the current context contains a valid generated application. This is necesary for most - * generators (besides the app generator). - * - * @param ctx The context to check against - * @returns Throws an error or returns the original context - */ -export const checkPreconditions = - () => - async (ctx: T) => { - if (!ctx.feathers) { - throw new FeathersGeneratorError('Invalid Feathers application context', { - reason: 'Missing Feathers configuration', - suggestedAction: 'Verify package.json contains Feathers metadata' - }) - } - return ctx - } - -const importRegex = /from '(\..*)'/g -const escapeNewLines = (code: string) => code.replace(/\n\n/g, '\n/* :newline: */') -const restoreNewLines = (code: string) => code.replace(/\/\* :newline: \*\//g, '\n') -const fixLocalImports = (code: string) => code.replace(importRegex, "from '$1.js'") - -/** - * Returns the transpiled and prettified JavaScript for a TypeScript source code - * - * @param typescript The TypeScript source code - * @param options TypeScript transpilation options - * @returns The formatted JavaScript source code - */ -export const getJavaScript = (typescript: string, options: ts.TranspileOptions = {}) => { - const source = escapeNewLines(typescript) - const transpiled = ts.transpileModule(source, { - ...options, - compilerOptions: { - module: ts.ModuleKind.ESNext, - target: ts.ScriptTarget.ES2020, - preserveValueImports: true, - ...options.compilerOptions - } - }) - const { outputText } = transpiled - - if (outputText.startsWith('export {}') && typescript.startsWith('import')) { - return fixLocalImports(typescript) - } - - return fixLocalImports(restoreNewLines(transpiled.outputText)) -} - -const getFileName = async ( - target: Callable, - ctx: C -) => `${await getCallable(target, ctx)}.${ctx.language}` - -/** - * The default configuration for prettifying files - */ -export const PRETTIERRC: PrettierOptions = { - tabWidth: 2, - useTabs: false, - printWidth: 110, - semi: false, - trailingComma: 'none', - singleQuote: true, - arrowParens: 'avoid', - bracketSpacing: true, - endOfLine: 'auto', - jsxSingleQuote: false, - quoteProps: 'as-needed' -} - -/* - * Format a source file using Prettier. Will use the local configuration, the settings set in - * `options` or a default configuration - * - * @param target The file to prettify - * @param options The Prettier options - * @returns The updated context - */ -export const prettify = - ( - target: Callable, - options: PrettierOptions = PRETTIERRC - ) => - async (ctx: C) => { - const fileName = await getFileName(target, ctx) - const config = (await prettier.resolveConfig(ctx.cwd)) || options - const content = (await readFile(fileName)).toString() - - try { - await writeFile( - fileName, - await prettier.format(content, { - parser: ctx.language === 'ts' ? 'typescript' : 'babel', - ...config - }) - ) - } catch (error: any) { - throw new Error(`Error prettifying ${fileName}: ${error.message}`) - } - - return ctx - } - -/** - * Render a source file template for the language set in the context. - * - * @param templates The JavaScript and TypeScript template to render - * @param target The target filename without extension (will be added based on language) - * @returns The updated context - */ -export const renderSource = - ( - template: Callable, - target: Callable, - options?: { force: boolean } - ) => - async (ctx: C) => { - const { language } = ctx - const fileName = await getFileName(target, ctx) - const content = language === 'js' ? getJavaScript(await getCallable(template, ctx)) : template - const renderer = renderTemplate(content, fileName, options) - - return renderer(ctx).then(prettify(target)) - } - -export const install = - ( - dependencies: Callable, - dev: Callable, - packager: Callable - ) => - async (ctx: C) => { - const dependencyList = await getCallable(dependencies, ctx) - const packageManager = await getCallable(packager, ctx) - const flags = dev ? [packageManager === 'yarn' ? '--dev' : '--save-dev'] : [] - - return exec(packager, [packageManager === 'yarn' ? 'add' : 'install', ...dependencyList, ...flags])(ctx) - } - -/** - * Inject a source template as the language set in the context. - * - * @param template The source template to render - * @param location The location to inject the code to. Must use the target language. - * @param target The target file name - * @param transpile Set to `false` if the code should not be transpiled to JavaScript - * @returns - */ -export const injectSource = - ( - template: Callable, - location: Location, - target: Callable, - transpile = true - ) => - async (ctx: C) => { - const { language } = ctx - const source = - language === 'js' && transpile ? getJavaScript(await getCallable(template, ctx)) : template - const fileName = await getFileName(target, ctx) - const injector = inject(source, location, fileName) - - return injector(ctx).then(prettify(target)) - } - -/** - * Synchronously checks if a file exits - * @param context The base context - * @param filenames The filenames to check - * @returns Wether the file exists or not - */ -export const fileExists = (...filenames: string[]) => fs.existsSync(join(...filenames)) - -/** - * The helper used by Knex to create migration names - * @returns The current date and time in the format `YYYYMMDDHHMMSS` - */ -export const yyyymmddhhmmss = (offset = 0) => { - const now = new Date(Date.now() + offset) - - return ( - now.getUTCFullYear().toString() + - (now.getUTCMonth() + 1).toString().padStart(2, '0') + - now.getUTCDate().toString().padStart(2, '0') + - now.getUTCHours().toString().padStart(2, '0') + - now.getUTCMinutes().toString().padStart(2, '0') + - now.getUTCSeconds().toString().padStart(2, '0') - ) -} - -/** - * Render a template if `local` authentication strategy has been selected - * @param authStrategies The list of selected authentication strategies - * @param content The content to render if `local` is selected - * @param alt The content to render if `local` is not selected - * @returns - */ -export const localTemplate = (authStrategies: string[], content: string, alt = '') => - authStrategies.includes('local') ? content : alt - -/** - * Render a template if an `oauth` authentication strategy has been selected - * @param authStrategies - * @param content - * @returns - */ -export const oauthTemplate = (authStrategies: string[], content: string) => - authStrategies.filter((s) => s !== 'local').length > 0 ? content : '' diff --git a/packages/generators/src/connection/index.ts b/packages/generators/src/connection/index.ts deleted file mode 100644 index faffdd6d14..0000000000 --- a/packages/generators/src/connection/index.ts +++ /dev/null @@ -1,138 +0,0 @@ -import { dirname } from 'path' -import { runGenerator, prompt, mergeJSON, toFile, when } from '@featherscloud/pinion' -import { fileURLToPath } from 'url' -import chalk from 'chalk' -import { - install, - FeathersBaseContext, - DatabaseType, - getDatabaseAdapter, - addVersions, - checkPreconditions, - initializeBaseContext -} from '../commons.js' - -// Set __dirname in es module -const __dirname = dirname(fileURLToPath(import.meta.url)) - -export interface ConnectionGeneratorContext extends FeathersBaseContext { - name?: string - database: DatabaseType - connectionString: string - dependencies: string[] -} - -export type ConnectionGeneratorArguments = FeathersBaseContext & - Partial> - -export const defaultConnectionString = (type: DatabaseType, name: string) => { - const connectionStrings = { - mongodb: `mongodb://127.0.0.1:27017/${name}`, - mysql: `mysql://root:@localhost:3306/${name}`, - postgresql: `postgres://postgres:@localhost:5432/${name}`, - sqlite: `${name}.sqlite`, - mssql: `mssql://root:password@localhost:1433/${name}`, - other: '' - } - - return connectionStrings[type] -} - -export const prompts = ({ database, connectionString, pkg, name }: ConnectionGeneratorArguments) => [ - { - name: 'database', - type: 'list', - when: !database, - message: 'Which database are you connecting to?', - suffix: chalk.grey(' Databases can be added at any time'), - choices: [ - { value: 'sqlite', name: 'SQLite' }, - { value: 'mongodb', name: 'MongoDB' }, - { value: 'postgresql', name: 'PostgreSQL' }, - { value: 'mysql', name: 'MySQL/MariaDB' }, - { value: 'mssql', name: 'Microsoft SQL' }, - { - value: 'other', - name: `Another database ${chalk.grey('(not configured automatically, use with custom services)')}` - } - ] - }, - { - name: 'connectionString', - type: 'input', - when: (answers: ConnectionGeneratorContext) => - !connectionString && database !== 'other' && answers.database !== 'other', - message: 'Enter your database connection string', - default: (answers: ConnectionGeneratorContext) => - defaultConnectionString(answers.database, answers.name || name || pkg.name) - } -] - -export const DATABASE_CLIENTS = { - mongodb: 'mongodb', - sqlite: 'sqlite3', - postgresql: 'pg', - mysql: 'mysql', - mssql: 'mssql' -} - -export const getDatabaseClient = (database: DatabaseType) => - database === 'other' ? null : DATABASE_CLIENTS[database] - -export const generate = (ctx: ConnectionGeneratorArguments) => - Promise.resolve(ctx) - .then(initializeBaseContext()) - .then(checkPreconditions()) - .then(prompt(prompts)) - .then((ctx) => ctx as ConnectionGeneratorContext) - .then( - when( - (ctx) => ctx.database !== 'other', - runGenerator( - __dirname, - 'templates', - ({ database }) => `${getDatabaseAdapter(database)}.tpl.js` - ), - mergeJSON( - ({ connectionString, database }) => - getDatabaseAdapter(database) === 'knex' - ? { - [database]: { - client: getDatabaseClient(database), - connection: connectionString, - ...(database === 'sqlite' ? { useNullAsDefault: true } : {}) - } - } - : { - [database]: connectionString - }, - toFile('config', 'default.json') - ), - async (ctx: ConnectionGeneratorContext) => { - const dependencies: string[] = [] - const adapter = getDatabaseAdapter(ctx.database) - const dbClient = getDatabaseClient(ctx.database) - - dependencies.push(`@feathersjs/${adapter}`) - - if (adapter === 'knex') { - dependencies.push('knex') - } - - dependencies.push(dbClient) - - if (ctx.dependencies) { - return { - ...ctx, - dependencies: [...ctx.dependencies, ...dependencies] - } - } - - return install( - addVersions(dependencies, ctx.dependencyVersions), - false, - ctx.feathers.packager - )(ctx) - } - ) - ) diff --git a/packages/generators/src/connection/templates/knex.tpl.ts b/packages/generators/src/connection/templates/knex.tpl.ts deleted file mode 100644 index afa6ef6d79..0000000000 --- a/packages/generators/src/connection/templates/knex.tpl.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { toFile, before, mergeJSON } from '@featherscloud/pinion' -import { ConnectionGeneratorContext } from '../index.js' -import { injectSource, renderSource } from '../../commons.js' -import { mkdir } from 'fs/promises' -import path from 'path' - -const template = ({ - database -}: ConnectionGeneratorContext) => /* ts */ `// For more information about this file see https://dove.feathersjs.com/guides/cli/databases.html -import knex from 'knex' -import type { Knex } from 'knex' -import type { Application } from './declarations' - -declare module './declarations' { - interface Configuration { - ${database}Client: Knex - } -} - -export const ${database} = (app: Application) => { - const config = app.get('${database}') - const db = knex(config!) - - app.set('${database}Client', db) -} -` - -const knexfile = ({ - lib, - language, - database -}: ConnectionGeneratorContext) => /* ts */ `// For more information about this file see https://dove.feathersjs.com/guides/cli/databases.html -import { app } from './${lib}/app' - -// Load our database connection info from the app configuration -const config = app.get('${database}') - -${language === 'js' ? 'export default config' : 'module.exports = config'} -` - -const importTemplate = ({ database }: ConnectionGeneratorContext) => - `import { ${database} } from './${database}'` -const configureTemplate = ({ database }: ConnectionGeneratorContext) => `app.configure(${database})` - -const toAppFile = toFile(({ lib }) => [lib, 'app']) - -export const generate = (ctx: ConnectionGeneratorContext) => - Promise.resolve(ctx) - .then( - renderSource( - template, - toFile(({ lib, database }) => [lib, database]) - ) - ) - .then(renderSource(knexfile, toFile('knexfile'))) - .then( - mergeJSON( - (ctx) => ({ - scripts: { - migrate: 'knex migrate:latest', - 'migrate:make': 'knex migrate:make' + (ctx.language === 'js' ? ' -x mjs' : ''), - test: 'cross-env NODE_ENV=test npm run migrate && npm run mocha' - } - }), - toFile('package.json') - ) - ) - .then(injectSource(importTemplate, before('import { services } from'), toAppFile)) - .then(injectSource(configureTemplate, before('app.configure(services)'), toAppFile)) - .then(async (ctx) => { - await mkdir(path.join(ctx.cwd, 'migrations')) - return ctx - }) diff --git a/packages/generators/src/connection/templates/mongodb.tpl.ts b/packages/generators/src/connection/templates/mongodb.tpl.ts deleted file mode 100644 index 87d765fc96..0000000000 --- a/packages/generators/src/connection/templates/mongodb.tpl.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { toFile, before, prepend, append } from '@featherscloud/pinion' -import { ConnectionGeneratorContext } from '../index.js' -import { injectSource, renderSource } from '../../commons.js' - -const template = ({ - database -}: ConnectionGeneratorContext) => /* ts */ `// For more information about this file see https://dove.feathersjs.com/guides/cli/databases.html -import { MongoClient } from 'mongodb' -import type { Db } from 'mongodb' -import type { Application } from './declarations' - -declare module './declarations' { - interface Configuration { - ${database}Client: Promise - } -} - -export const ${database} = (app: Application) => { - const connection = app.get('${database}') as string - const database = new URL(connection).pathname.substring(1) - const mongoClient = MongoClient.connect(connection) - .then(client => client.db(database)) - - app.set('${database}Client', mongoClient) -} -` - -const keywordImport = `import { keywordObjectId } from '@feathersjs/mongodb'` - -const keywordTemplate = `dataValidator.addKeyword(keywordObjectId) -queryValidator.addKeyword(keywordObjectId)` - -const importTemplate = ({ database }: ConnectionGeneratorContext) => - `import { ${database} } from './${database}'` -const configureTemplate = ({ database }: ConnectionGeneratorContext) => `app.configure(${database})` -const toAppFile = toFile(({ lib }) => [lib, 'app']) -const toValidatorFile = toFile(({ lib }) => [lib, 'validators']) - -export const generate = (ctx: ConnectionGeneratorContext) => - Promise.resolve(ctx) - .then( - renderSource( - template, - toFile(({ lib, database }) => [lib, database]) - ) - ) - .then(injectSource(importTemplate, before('import { services } from'), toAppFile)) - .then(injectSource(configureTemplate, before('app.configure(services)'), toAppFile)) - .then(injectSource(keywordImport, prepend(), toValidatorFile)) - .then(injectSource(keywordTemplate, append(), toValidatorFile)) diff --git a/packages/generators/src/hook/index.ts b/packages/generators/src/hook/index.ts deleted file mode 100644 index fb4976b5ef..0000000000 --- a/packages/generators/src/hook/index.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { dirname } from 'path' -import { fileURLToPath } from 'url' -import { prompt, runGenerators } from '@featherscloud/pinion' -import _ from 'lodash' -import { checkPreconditions, FeathersBaseContext, initializeBaseContext } from '../commons.js' - -// Set __dirname in es module -const __dirname = dirname(fileURLToPath(import.meta.url)) - -export interface HookGeneratorContext extends FeathersBaseContext { - name: string - camelName: string - kebabName: string - type: 'regular' | 'around' -} - -export const generate = (ctx: HookGeneratorContext) => - Promise.resolve(ctx) - .then(initializeBaseContext()) - .then(checkPreconditions()) - .then( - prompt(({ type, name }) => [ - { - type: 'input', - name: 'name', - message: 'What is the name of the hook?', - when: !name - }, - { - name: 'type', - type: 'list', - when: !type, - message: 'What kind of hook is it?', - choices: [ - { value: 'around', name: 'Around' }, - { value: 'regular', name: 'Before, After or Error' } - ] - } - ]) - ) - .then((ctx) => { - const { name } = ctx - const kebabName = _.kebabCase(name) - const camelName = _.camelCase(name) - - return { - ...ctx, - kebabName, - camelName - } - }) - .then(runGenerators(__dirname, 'templates')) diff --git a/packages/generators/src/hook/templates/hook.tpl.ts b/packages/generators/src/hook/templates/hook.tpl.ts deleted file mode 100644 index 3eac00ded0..0000000000 --- a/packages/generators/src/hook/templates/hook.tpl.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { toFile } from '@featherscloud/pinion' -import { HookGeneratorContext } from '../index.js' -import { renderSource } from '../../commons.js' - -const aroundTemplate = ({ - camelName, - name -}: HookGeneratorContext) => /* ts */ `// For more information about this file see https://dove.feathersjs.com/guides/cli/hook.html -import type { HookContext, NextFunction } from '../declarations' - -export const ${camelName} = async (context: HookContext, next: NextFunction) => { - console.log(\`Running hook ${name} on \${context.path}\.\${context.method}\`) - await next() -} -` - -const regularTemplate = ({ - camelName, - name -}: HookGeneratorContext) => /* ts */ `// For more information about this file see https://dove.feathersjs.com/guides/cli/hook.html -import type { HookContext } from '../declarations' - -export const ${camelName} = async (context: HookContext) => { - console.log(\`Running hook ${name} on \${context.path}\.\${context.method}\`) -}` - -export const generate = (ctx: HookGeneratorContext) => - Promise.resolve(ctx).then( - renderSource( - (ctx) => (ctx.type === 'around' ? aroundTemplate(ctx) : regularTemplate(ctx)), - toFile(({ lib, kebabName }) => [lib, 'hooks', kebabName]) - ) - ) diff --git a/packages/generators/src/index.ts b/packages/generators/src/index.ts deleted file mode 100644 index 3c28c6732f..0000000000 --- a/packages/generators/src/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -export * from '@featherscloud/pinion' - -export * from './commons.js' -export * as app from './app/index.js' -export * as authentication from './authentication/index.js' -export * as connection from './connection/index.js' -export * as hook from './hook/index.js' -export * as service from './service/index.js' diff --git a/packages/generators/src/service/index.ts b/packages/generators/src/service/index.ts deleted file mode 100644 index f3268fde5b..0000000000 --- a/packages/generators/src/service/index.ts +++ /dev/null @@ -1,214 +0,0 @@ -import { dirname } from 'path' -import _ from 'lodash' -import { runGenerator, runGenerators, prompt } from '@featherscloud/pinion' -import { fileURLToPath } from 'url' -import chalk from 'chalk' - -import { - checkPreconditions, - DATABASE_TYPES, - FeathersBaseContext, - fileExists, - getDatabaseAdapter, - initializeBaseContext -} from '../commons.js' - -// Set __dirname in es module -const __dirname = dirname(fileURLToPath(import.meta.url)) - -export interface ServiceGeneratorContext extends FeathersBaseContext { - /** - * The chosen service name - */ - name: string - /** - * The path the service is registered on - */ - path: string - /** - * The list of subfolders this service is in - */ - folder: string[] - /** - * The `camelCase` service name starting with a lowercase letter - */ - camelName: string - /** - * The `CamelCase` service name starting with an uppercase letter - */ - upperName: string - /** - * The service class name combined as `CamelCaseService` - */ - className: string - /** - * A kebab-cased (filename friendly) version of the service name - */ - kebabName: string - /** - * The actual filename (the last element of the path) - */ - fileName: string - /** - * The kebab-cased name of the path. Will be used for e.g. database names - */ - kebabPath: string - /** - * Indicates how many file paths we should go up to import other things (e.g. `../../`) - */ - relative: string - /** - * The chosen service type - */ - type: 'knex' | 'mongodb' | 'custom' - /** - * Which schema definition format to use - */ - schema: 'typebox' | 'json' | false - /** - * Wether this service uses authentication - */ - authentication: boolean - /** - * Set to true if this service is for an authentication entity - */ - isEntityService?: boolean - /** - * The authentication strategies (if it is an entity service) - */ - authStrategies: string[] -} - -/** - * Parameters the generator is called with - */ -export type ServiceGeneratorArguments = FeathersBaseContext & - Partial< - Pick - > - -export const generate = (ctx: ServiceGeneratorArguments) => - Promise.resolve(ctx) - .then(initializeBaseContext()) - .then(checkPreconditions()) - .then( - prompt(({ name, path, type, schema, authentication, isEntityService, feathers, lib, language }) => { - const sqlDisabled = DATABASE_TYPES.every( - (name) => name === 'mongodb' || name === 'other' || !fileExists(lib, `${name}.${language}`) - ) - const mongodbDisabled = !fileExists(lib, `mongodb.${language}`) - - return [ - { - name: 'name', - type: 'input', - when: !name, - message: 'What is the name of your service?', - validate: (input: any) => { - if (!input || input === 'authentication') { - return 'Invalid service name' - } - - return true - } - }, - { - name: 'path', - type: 'input', - when: !path, - message: 'Which path should the service be registered on?', - default: (answers: ServiceGeneratorArguments) => `${_.kebabCase(answers.name)}`, - validate: (input: any) => { - if (!input || input === 'authentication') { - return 'Invalid service path' - } - - return true - } - }, - { - name: 'authentication', - type: 'confirm', - when: authentication === undefined && !isEntityService, - message: 'Does this service require authentication?' - }, - { - name: 'type', - type: 'list', - when: !type, - message: 'What database is the service using?', - default: getDatabaseAdapter(feathers?.database), - choices: [ - { - value: 'knex', - name: `SQL${sqlDisabled ? chalk.gray(' (connection not available)') : ''}`, - disabled: sqlDisabled - }, - { - value: 'mongodb', - name: `MongoDB${mongodbDisabled ? chalk.gray(' (connection not available)') : ''}`, - disabled: mongodbDisabled - }, - { - value: 'custom', - name: 'A custom service' - } - ] - }, - { - name: 'schema', - type: 'list', - when: schema === undefined, - message: 'Which schema definition format do you want to use?', - suffix: chalk.grey(' Schemas allow to type, validate, secure and populate data'), - default: feathers?.schema, - choices: (answers: ServiceGeneratorContext) => [ - { - value: 'typebox', - name: `TypeBox ${chalk.gray(' (recommended)')}` - }, - { - value: 'json', - name: 'JSON schema' - }, - { - value: false, - name: `No schema${ - answers.type !== 'custom' ? chalk.gray(' (not recommended with a database)') : '' - }` - } - ] - } - ] - }) - ) - .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 className = `${upperName}Service` - - const folder = path.split('/').filter((el) => el !== '') - const relative = ['', ...folder].map(() => '..').join('/') - const fileName = _.last(folder) - const kebabPath = _.kebabCase(path) - - return { - name, - type, - path, - folder, - fileName, - upperName, - className, - kebabName, - camelName, - kebabPath, - relative, - authStrategies, - ...ctx - } as ServiceGeneratorContext - }) - .then(runGenerators(__dirname, 'templates')) - .then(runGenerator(__dirname, 'type', ({ type }) => `${type}.tpl.js`)) diff --git a/packages/generators/src/service/templates/client.tpl.ts b/packages/generators/src/service/templates/client.tpl.ts deleted file mode 100644 index 8e3891b575..0000000000 --- a/packages/generators/src/service/templates/client.tpl.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { toFile, after, before, when } from '@featherscloud/pinion' -import { fileExists, injectSource } from '../../commons.js' -import { ServiceGeneratorContext } from '../index.js' - -const importTemplate = ({ upperName, folder, fileName, camelName }: ServiceGeneratorContext) => /* ts */ ` -import { ${camelName}Client } from './services/${folder.join('/')}/${fileName}.shared' -export type { - ${upperName}, - ${upperName}Data, - ${upperName}Query, - ${upperName}Patch -} from './services/${folder.join('/')}/${fileName}.shared' -` - -const registrationTemplate = ({ camelName }: ServiceGeneratorContext) => - ` client.configure(${camelName}Client)` - -const toClientFile = toFile(({ lib }) => [lib, 'client']) - -export const generate = async (ctx: ServiceGeneratorContext) => - Promise.resolve(ctx).then( - when( - ({ lib, language }) => fileExists(lib, `client.${language}`), - injectSource(registrationTemplate, before('return client'), toClientFile), - injectSource( - importTemplate, - after(({ language }) => - language === 'ts' ? 'import type { AuthenticationClientOptions }' : 'import authenticationClient' - ), - toClientFile - ) - ) - ) diff --git a/packages/generators/src/service/templates/schema.json.tpl.ts b/packages/generators/src/service/templates/schema.json.tpl.ts deleted file mode 100644 index 18143fc273..0000000000 --- a/packages/generators/src/service/templates/schema.json.tpl.ts +++ /dev/null @@ -1,143 +0,0 @@ -import { toFile, when } from '@featherscloud/pinion' -import { fileExists, localTemplate, renderSource } from '../../commons.js' -import { ServiceGeneratorContext } from '../index.js' - -const authFieldsTemplate = (authStrategies: string[]) => - authStrategies - .map((name) => - name === 'local' - ? ` email: { type: 'string' }, - password: { type: 'string' }` - : ` ${name}Id: { type: 'string' }` - ) - .join(',\n') - -const template = ({ - camelName, - upperName, - fileName, - relative, - authStrategies, - isEntityService, - type, - cwd, - lib -}: ServiceGeneratorContext) => /* ts */ `// For more information about this file see https://dove.feathersjs.com/guides/cli/service.schemas.html -import { resolve, getValidator, querySyntax } from '@feathersjs/schema'${ - type === 'mongodb' - ? ` -import { ObjectIdSchema } from '@feathersjs/schema'` - : '' -} -import type { FromSchema } from '@feathersjs/schema' -${localTemplate(authStrategies, `import { passwordHash } from '@feathersjs/authentication-local'`)} - -import type { HookContext } from '${relative}/declarations' -import { dataValidator, queryValidator } from '${relative}/${ - fileExists(cwd, lib, 'schemas') ? 'schemas/' : '' // This is for legacy backwards compatibility -}validators' -import type { ${upperName}Service } from './${fileName}.class' - -// Main data model schema -export const ${camelName}Schema = { - $id: '${upperName}', - type: 'object', - additionalProperties: false, - required: [ '${type === 'mongodb' ? '_id' : 'id'}', ${localTemplate(authStrategies, `'email'`, `'text'`)} ], - properties: { - ${type === 'mongodb' ? `_id: ObjectIdSchema(),` : `id: { type: 'number' },`} - ${ - isEntityService - ? authFieldsTemplate(authStrategies) - : ` - text: { type: 'string' }` - } - } -} as const -export type ${upperName} = FromSchema -export const ${camelName}Validator = getValidator(${camelName}Schema, dataValidator) -export const ${camelName}Resolver = resolve<${upperName}, HookContext<${upperName}Service>>({}) - -export const ${camelName}ExternalResolver = resolve<${upperName}, HookContext<${upperName}Service>>({ - ${localTemplate( - authStrategies, - `// The password should never be visible externally - password: async () => undefined` - )} -}) - -// Schema for creating new data -export const ${camelName}DataSchema = { - $id: '${upperName}Data', - type: 'object', - additionalProperties: false, - required: [ ${localTemplate(authStrategies, `'email'`, `'text'`)} ], - properties: { - ...${camelName}Schema.properties - } -} as const -export type ${upperName}Data = FromSchema -export const ${camelName}DataValidator = getValidator(${camelName}DataSchema, dataValidator) -export const ${camelName}DataResolver = resolve<${upperName}Data, HookContext<${upperName}Service>>({ - ${localTemplate(authStrategies, `password: passwordHash({ strategy: 'local' })`)} -}) - -// Schema for updating existing data -export const ${camelName}PatchSchema = { - $id: '${upperName}Patch', - type: 'object', - additionalProperties: false, - required: [], - properties: { - ...${camelName}Schema.properties - } -} as const -export type ${upperName}Patch = FromSchema -export const ${camelName}PatchValidator = getValidator(${camelName}PatchSchema, dataValidator) -export const ${camelName}PatchResolver = resolve<${upperName}Patch, HookContext<${upperName}Service>>({ - ${localTemplate(authStrategies, `password: passwordHash({ strategy: 'local' })`)} -}) - -// Schema for allowed query properties -export const ${camelName}QuerySchema = { - $id: '${upperName}Query', - type: 'object', - additionalProperties: false, - properties: { - ...querySyntax(${camelName}Schema.properties) - } -} as const -export type ${upperName}Query = FromSchema -export const ${camelName}QueryValidator = getValidator(${camelName}QuerySchema, queryValidator) -export const ${camelName}QueryResolver = resolve<${upperName}Query, HookContext<${upperName}Service>>({ - ${ - isEntityService - ? ` - // If there is a user (e.g. with authentication), they are only allowed to see their own data - ${type === 'mongodb' ? '_id' : 'id'}: async (value, user, context) => { - if (context.params.user) { - return context.params.user.${type === 'mongodb' ? '_id' : 'id'} - } - - return value - }` - : '' - } -}) -` - -export const generate = (ctx: ServiceGeneratorContext) => - Promise.resolve(ctx).then( - when( - ({ schema }) => schema === 'json', - renderSource( - template, - toFile(({ lib, folder, fileName }: ServiceGeneratorContext) => [ - lib, - 'services', - ...folder, - `${fileName}.schema` - ]) - ) - ) - ) diff --git a/packages/generators/src/service/templates/schema.typebox.tpl.ts b/packages/generators/src/service/templates/schema.typebox.tpl.ts deleted file mode 100644 index 3f7203f5c3..0000000000 --- a/packages/generators/src/service/templates/schema.typebox.tpl.ts +++ /dev/null @@ -1,131 +0,0 @@ -import { toFile, when } from '@featherscloud/pinion' -import { fileExists, localTemplate, renderSource } from '../../commons.js' -import { ServiceGeneratorContext } from '../index.js' - -const authFieldsTemplate = (authStrategies: string[]) => - authStrategies - .map((name) => - name === 'local' - ? ` email: Type.String(), - password: Type.Optional(Type.String())` - : ` ${name}Id: Type.Optional(Type.String())` - ) - .join(',\n') - -const template = ({ - camelName, - upperName, - fileName, - relative, - authStrategies, - isEntityService, - type, - cwd, - lib -}: ServiceGeneratorContext) => /* ts */ `// // For more information about this file see https://dove.feathersjs.com/guides/cli/service.schemas.html -import { resolve } from '@feathersjs/schema' -import { Type, getValidator, querySyntax } from '@feathersjs/typebox'${ - type === 'mongodb' - ? ` -import { ObjectIdSchema } from '@feathersjs/typebox'` - : '' -} -import type { Static } from '@feathersjs/typebox' -${localTemplate(authStrategies, `import { passwordHash } from '@feathersjs/authentication-local'`)} - -import type { HookContext } from '${relative}/declarations' -import { dataValidator, queryValidator } from '${relative}/${ - fileExists(cwd, lib, 'schemas') ? 'schemas/' : '' // This is for legacy backwards compatibility -}validators' -import type { ${upperName}Service } from './${fileName}.class' - -// Main data model schema -export const ${camelName}Schema = Type.Object({ - ${type === 'mongodb' ? '_id: ObjectIdSchema()' : 'id: Type.Number()'}, - ${isEntityService ? authFieldsTemplate(authStrategies) : `text: Type.String()`} - }, { $id: '${upperName}', additionalProperties: false }) -export type ${upperName} = Static -export const ${camelName}Validator = getValidator(${camelName}Schema, dataValidator) -export const ${camelName}Resolver = resolve<${upperName}, HookContext<${upperName}Service>>({}) - -export const ${camelName}ExternalResolver = resolve<${upperName}, HookContext<${upperName}Service>>({ - ${localTemplate( - authStrategies, - `// The password should never be visible externally - password: async () => undefined` - )} -}) - -// Schema for creating new entries -export const ${camelName}DataSchema = Type.Pick(${camelName}Schema, [ - ${ - isEntityService - ? authStrategies.map((name) => (name === 'local' ? `'email', 'password'` : `'${name}Id'`)).join(', ') - : `'text'` - } -], { - $id: '${upperName}Data' -}) -export type ${upperName}Data = Static -export const ${camelName}DataValidator = getValidator(${camelName}DataSchema, dataValidator) -export const ${camelName}DataResolver = resolve<${upperName}, HookContext<${upperName}Service>>({ - ${localTemplate(authStrategies, `password: passwordHash({ strategy: 'local' })`)} -}) - -// Schema for updating existing entries -export const ${camelName}PatchSchema = Type.Partial(${camelName}Schema, { - $id: '${upperName}Patch' -}) -export type ${upperName}Patch = Static -export const ${camelName}PatchValidator = getValidator(${camelName}PatchSchema, dataValidator) -export const ${camelName}PatchResolver = resolve<${upperName}, HookContext<${upperName}Service>>({ - ${localTemplate(authStrategies, `password: passwordHash({ strategy: 'local' })`)} -}) - -// Schema for allowed query properties -export const ${camelName}QueryProperties = Type.Pick(${camelName}Schema, [ - '${type === 'mongodb' ? '_id' : 'id'}', ${ - isEntityService - ? authStrategies.map((name) => (name === 'local' ? `'email'` : `'${name}Id'`)).join(', ') - : `'text'` - } -]) -export const ${camelName}QuerySchema = Type.Intersect([ - querySyntax(${camelName}QueryProperties), - // Add additional query properties here - Type.Object({}, { 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>>({ - ${ - isEntityService - ? ` - // If there is a user (e.g. with authentication), they are only allowed to see their own data - ${type === 'mongodb' ? '_id' : 'id'}: async (value, user, context) => { - if (context.params.user) { - return context.params.user.${type === 'mongodb' ? '_id' : 'id'} - } - - return value - }` - : '' - } -}) -` - -export const generate = (ctx: ServiceGeneratorContext) => - Promise.resolve(ctx).then( - when( - ({ schema }) => schema === 'typebox', - renderSource( - template, - toFile(({ lib, folder, fileName }: ServiceGeneratorContext) => [ - lib, - 'services', - ...folder, - `${fileName}.schema` - ]) - ) - ) - ) diff --git a/packages/generators/src/service/templates/service.tpl.ts b/packages/generators/src/service/templates/service.tpl.ts deleted file mode 100644 index e0be40e1e0..0000000000 --- a/packages/generators/src/service/templates/service.tpl.ts +++ /dev/null @@ -1,161 +0,0 @@ -import { toFile, after, prepend } from '@featherscloud/pinion' -import { fileExists, injectSource, renderSource } from '../../commons.js' -import { ServiceGeneratorContext } from '../index.js' - -export const template = ({ - camelName, - authentication, - isEntityService, - path, - lib, - language, - className, - relative, - schema, - fileName -}: ServiceGeneratorContext) => /* ts */ `// For more information about this file see https://dove.feathersjs.com/guides/cli/service.html -${authentication || isEntityService ? `import { authenticate } from '@feathersjs/authentication'` : ''} -${ - schema - ? ` -import { hooks as schemaHooks } from '@feathersjs/schema' - -import { - ${camelName}DataValidator, - ${camelName}PatchValidator, - ${camelName}QueryValidator, - ${camelName}Resolver, - ${camelName}ExternalResolver, - ${camelName}DataResolver, - ${camelName}PatchResolver, - ${camelName}QueryResolver -} from './${fileName}.schema' -` - : '' -} - -import type { Application } from '${relative}/declarations' -import { ${className}, getOptions } from './${fileName}.class' -${ - fileExists(lib, `client.${language}`) - ? `import { ${camelName}Path, ${camelName}Methods } from './${fileName}.shared'` - : ` -export const ${camelName}Path = '${path}' -export const ${camelName}Methods: Array = ['find', 'get', 'create', 'patch', 'remove']` -} - -export * from './${fileName}.class' -${schema ? `export * from './${fileName}.schema'` : ''} - -// A configure function that registers the service and its hooks via \`app.configure\` -export const ${camelName} = (app: Application) => { - // Register our service on the Feathers application - app.use(${camelName}Path, new ${className}(getOptions(app)), { - // A list of all methods this service exposes externally - methods: ${camelName}Methods, - // You can add additional custom events to be sent to clients here - events: [] - }) - // Initialize hooks - app.service(${camelName}Path).hooks({ - around: { - all: [${ - authentication - ? ` - authenticate('jwt'),` - : '' - } ${ - schema - ? ` - schemaHooks.resolveExternal(${camelName}ExternalResolver), - schemaHooks.resolveResult(${camelName}Resolver),` - : '' - } - ],${ - isEntityService - ? ` - find: [authenticate('jwt')], - get: [authenticate('jwt')], - create: [], - update: [authenticate('jwt')], - patch: [authenticate('jwt')], - remove: [authenticate('jwt')]` - : '' - } - }, - before: { - all: [${ - schema - ? ` - schemaHooks.validateQuery(${camelName}QueryValidator), - schemaHooks.resolveQuery(${camelName}QueryResolver) - ` - : '' - }], - find: [], - get: [], - create: [${ - schema - ? ` - schemaHooks.validateData(${camelName}DataValidator), - schemaHooks.resolveData(${camelName}DataResolver) - ` - : '' - }], - patch: [${ - schema - ? ` - schemaHooks.validateData(${camelName}PatchValidator), - schemaHooks.resolveData(${camelName}PatchResolver) - ` - : '' - }], - remove: [] - }, - after: { - all: [] - }, - error: { - all: [] - } - }) -} - -// Add this service to the service type index -declare module '${relative}/declarations' { - interface ServiceTypes { - [${camelName}Path]: ${className} - } -} -` - -const toServiceIndex = toFile(({ lib }: ServiceGeneratorContext) => [lib, 'services', `index`]) - -export const generate = (ctx: ServiceGeneratorContext) => - Promise.resolve(ctx) - .then( - renderSource( - template, - toFile(({ lib, fileName, folder }: ServiceGeneratorContext) => [ - lib, - 'services', - ...folder, - `${fileName}` - ]) - ) - ) - .then( - injectSource( - ({ camelName, folder, fileName }) => - `import { ${camelName} } from './${folder.join('/')}/${fileName}'`, - prepend(), - toServiceIndex - ) - ) - .then( - injectSource( - ({ camelName }) => ` app.configure(${camelName})`, - after('export const services'), - toServiceIndex - ) - ) diff --git a/packages/generators/src/service/templates/shared.tpl.ts b/packages/generators/src/service/templates/shared.tpl.ts deleted file mode 100644 index e01192b906..0000000000 --- a/packages/generators/src/service/templates/shared.tpl.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { toFile, when } from '@featherscloud/pinion' -import { fileExists, renderSource } from '../../commons.js' -import { ServiceGeneratorContext } from '../index.js' - -const sharedTemplate = ({ - camelName, - upperName, - className, - fileName, - relative, - path -}: ServiceGeneratorContext) => /* ts */ `// For more information about this file see https://dove.feathersjs.com/guides/cli/service.shared.html -import type { Params } from '@feathersjs/feathers' -import type { ClientApplication } from '${relative}/client' -import type { - ${upperName}, - ${upperName}Data, - ${upperName}Patch, - ${upperName}Query, - ${className} -} from './${fileName}.class' - -export type { ${upperName}, ${upperName}Data, ${upperName}Patch, ${upperName}Query } - -export type ${upperName}ClientService = Pick< - ${className}>, - typeof ${camelName}Methods[number] -> - -export const ${camelName}Path = '${path}' - -export const ${camelName}Methods: Array = ['find', 'get', 'create', 'patch', 'remove'] - -export const ${camelName}Client = (client: ClientApplication) => { - const connection = client.get('connection') - - client.use(${camelName}Path, connection.service(${camelName}Path), { - methods: ${camelName}Methods - }) -} - -// Add this service to the client service type index -declare module '${relative}/client' { - interface ServiceTypes { - [${camelName}Path]: ${upperName}ClientService - } -} -` - -export const generate = async (ctx: ServiceGeneratorContext) => - Promise.resolve(ctx).then( - when( - ({ lib, language }) => fileExists(lib, `client.${language}`), - renderSource( - sharedTemplate, - toFile(({ lib, folder, fileName }: ServiceGeneratorContext) => [ - lib, - 'services', - ...folder, - `${fileName}.shared` - ]) - ) - ) - ) diff --git a/packages/generators/src/service/templates/test.tpl.ts b/packages/generators/src/service/templates/test.tpl.ts deleted file mode 100644 index bc79589278..0000000000 --- a/packages/generators/src/service/templates/test.tpl.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { toFile } from '@featherscloud/pinion' -import { renderSource } from '../../commons.js' -import { ServiceGeneratorContext } from '../index.js' - -const template = ({ - relative, - lib, - path -}: ServiceGeneratorContext) => /* ts */ `// For more information about this file see https://dove.feathersjs.com/guides/cli/service.test.html -import assert from 'assert' -import { app } from '../${relative}/${lib}/app' - -describe('${path} service', () => { - it('registered the service', () => { - const service = app.service('${path}') - - assert.ok(service, 'Registered the service') - }) -}) -` - -export const generate = (ctx: ServiceGeneratorContext) => - Promise.resolve(ctx).then( - renderSource( - template, - toFile(({ test, folder, fileName }) => [ - test, - 'services', - ...folder, - `${fileName}.test` - ]) - ) - ) diff --git a/packages/generators/src/service/type/custom.tpl.ts b/packages/generators/src/service/type/custom.tpl.ts deleted file mode 100644 index 87fe14cd84..0000000000 --- a/packages/generators/src/service/type/custom.tpl.ts +++ /dev/null @@ -1,112 +0,0 @@ -import { toFile } from '@featherscloud/pinion' -import { renderSource } from '../../commons.js' -import { ServiceGeneratorContext } from '../index.js' - -export const template = ({ - className, - upperName, - schema, - fileName, - relative -}: ServiceGeneratorContext) => /* ts */ `// For more information about this file see https://dove.feathersjs.com/guides/cli/service.class.html#custom-services -import type { Id, NullableId, Params, ServiceInterface } from '@feathersjs/feathers' - -import type { Application } from '${relative}/declarations' -${ - schema - ? `import type { - ${upperName}, - ${upperName}Data, - ${upperName}Patch, - ${upperName}Query -} from './${fileName}.schema' -` - : ` -type ${upperName} = any -type ${upperName}Data = any -type ${upperName}Patch = any -type ${upperName}Query = any -` -} - -export type { ${upperName}, ${upperName}Data, ${upperName}Patch, ${upperName}Query } - -export interface ${className}Options { - app: Application -} - -export interface ${upperName}Params extends Params<${upperName}Query> { - -} - -// This is a skeleton for a custom service class. Remove or add the methods you need here -export class ${className} - implements ServiceInterface<${upperName}, ${upperName}Data, ServiceParams, ${upperName}Patch> { - constructor (public options: ${className}Options) { - } - - async find (_params?: ServiceParams): Promise<${upperName}[]> { - return [] - } - - async get (id: Id, _params?: ServiceParams): Promise<${upperName}> { - return { - id: 0, - text: \`A new message with ID: \${id}!\` - } - } - - async create (data: ${upperName}Data, params?: ServiceParams): Promise<${upperName}> - async create (data: ${upperName}Data[], params?: ServiceParams): Promise<${upperName}[]> - async create (data: ${upperName}Data|${upperName}Data[], params?: ServiceParams): Promise<${upperName}|${upperName}[]> { - if (Array.isArray(data)) { - return Promise.all(data.map(current => this.create(current, params))); - } - - return { - id: 0, - ...data - } - } - - // This method has to be added to the 'methods' option to make it available to clients - async update (id: NullableId, data: ${upperName}Data, _params?: ServiceParams): Promise<${upperName}> { - return { - id: 0, - ...data - } - } - - async patch (id: NullableId, data: ${upperName}Patch, _params?: ServiceParams): Promise<${upperName}> { - return { - id: 0, - text: \`Fallback for \${id}\`, - ...data - } - } - - async remove (id: NullableId, _params?: ServiceParams): Promise<${upperName}> { - return { - id: 0, - text: 'removed' - } - } -} - -export const getOptions = (app: Application) => { - return { app } -} -` - -export const generate = (ctx: ServiceGeneratorContext) => - Promise.resolve(ctx).then( - renderSource( - template, - toFile(({ lib, folder, fileName }) => [ - lib, - 'services', - ...folder, - `${fileName}.class` - ]) - ) - ) diff --git a/packages/generators/src/service/type/knex.tpl.ts b/packages/generators/src/service/type/knex.tpl.ts deleted file mode 100644 index aec6ca4407..0000000000 --- a/packages/generators/src/service/type/knex.tpl.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { toFile } from '@featherscloud/pinion' -import { renderSource, yyyymmddhhmmss } from '../../commons.js' -import { ServiceGeneratorContext } from '../index.js' - -const migrationTemplate = ({ - kebabPath, - authStrategies, - isEntityService -}: ServiceGeneratorContext) => /* ts */ `// For more information about this file see https://dove.feathersjs.com/guides/cli/knexfile.html -import type { Knex } from 'knex' - -export async function up(knex: Knex): Promise { - await knex.schema.createTable('${kebabPath}', table => { - table.increments('id') - ${ - isEntityService - ? authStrategies - .map((name) => - name === 'local' - ? ` - table.string('email').unique() - table.string('password')` - : ` - table.string('${name}Id')` - ) - .join('\n') - : ` - table.string('text')` - } - }) -} - -export async function down(knex: Knex): Promise { - await knex.schema.dropTable('${kebabPath}') -} -` - -export const template = ({ - className, - upperName, - feathers, - schema, - fileName, - relative -}: ServiceGeneratorContext) => /* ts */ `// For more information about this file see https://dove.feathersjs.com/guides/cli/service.class.html#database-services -import type { Params } from '@feathersjs/feathers' -import { KnexService } from '@feathersjs/knex' -import type { KnexAdapterParams, KnexAdapterOptions } from '@feathersjs/knex' - -import type { Application } from '${relative}/declarations' -${ - schema - ? `import type { - ${upperName}, - ${upperName}Data, - ${upperName}Patch, - ${upperName}Query -} from './${fileName}.schema' -` - : ` -type ${upperName} = any -type ${upperName}Data = any -type ${upperName}Patch = any -type ${upperName}Query = any -` -} - -export type { ${upperName}, ${upperName}Data, ${upperName}Patch, ${upperName}Query } - -export interface ${upperName}Params extends KnexAdapterParams<${upperName}Query> { -} - -// By default calls the standard Knex adapter service methods but can be customized with your own functionality. -export class ${className} - extends KnexService<${upperName}, ${upperName}Data, ${upperName}Params, ${upperName}Patch> { -} - -export const getOptions = (app: Application): KnexAdapterOptions => { - return { - paginate: app.get('paginate'), - Model: app.get('${feathers.database}Client'), - name: '${fileName}' - } -} -` - -export const generate = (ctx: ServiceGeneratorContext) => - Promise.resolve(ctx) - .then( - renderSource( - template, - toFile(({ lib, folder, fileName }) => [ - lib, - 'services', - ...folder, - `${fileName}.class` - ]) - ) - ) - .then( - renderSource( - migrationTemplate, - toFile('migrations', ({ kebabName }) => `${yyyymmddhhmmss()}_${kebabName}`) - ) - ) diff --git a/packages/generators/src/service/type/mongodb.tpl.ts b/packages/generators/src/service/type/mongodb.tpl.ts deleted file mode 100644 index 1a5d967a37..0000000000 --- a/packages/generators/src/service/type/mongodb.tpl.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { toFile } from '@featherscloud/pinion' -import { renderSource } from '../../commons.js' -import { ServiceGeneratorContext } from '../index.js' - -export const template = ({ - className, - upperName, - schema, - fileName, - kebabPath, - relative -}: ServiceGeneratorContext) => /* ts */ `// For more information about this file see https://dove.feathersjs.com/guides/cli/service.class.html#database-services -import type { Params } from '@feathersjs/feathers' -import { MongoDBService } from \'@feathersjs/mongodb\' -import type { MongoDBAdapterParams, MongoDBAdapterOptions } from \'@feathersjs/mongodb\' - -import type { Application } from '${relative}/declarations' -${ - schema - ? `import type { - ${upperName}, - ${upperName}Data, - ${upperName}Patch, - ${upperName}Query -} from './${fileName}.schema' -` - : ` -type ${upperName} = any -type ${upperName}Data = any -type ${upperName}Patch = any -type ${upperName}Query = any -` -} - -export type { ${upperName}, ${upperName}Data, ${upperName}Patch, ${upperName}Query } - -export interface ${upperName}Params extends MongoDBAdapterParams<${upperName}Query> { -} - -// By default calls the standard MongoDB adapter service methods but can be customized with your own functionality. -export class ${className} - extends MongoDBService<${upperName}, ${upperName}Data, ${upperName}Params, ${upperName}Patch> { -} - -export const getOptions = (app: Application): MongoDBAdapterOptions => { - return { - paginate: app.get('paginate'), - Model: app.get('mongodbClient').then(db => db.collection('${kebabPath}')) - } -} -` - -export const generate = (ctx: ServiceGeneratorContext) => - Promise.resolve(ctx).then( - renderSource( - template, - toFile(({ lib, folder, fileName }) => [ - lib, - 'services', - ...folder, - `${fileName}.class` - ]) - ) - ) diff --git a/packages/generators/test/build/.gitkeep b/packages/generators/test/build/.gitkeep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/packages/generators/test/commons.test.ts b/packages/generators/test/commons.test.ts deleted file mode 100644 index 86a74df146..0000000000 --- a/packages/generators/test/commons.test.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { strictEqual } from 'assert' -import { getJavaScript } from '../lib/commons' - -describe('common tests', () => { - it('getJavaScript returns transpiled JavaScript', () => { - const transpiled = getJavaScript( - `import bla from 'bla' -import something from './file' - -type X = { name: string } - -function test (arg: X) { - bla(something) -} - -// This is a comment -const otherThing: string = "Hello" -` - ) - - strictEqual( - transpiled, - `import bla from 'bla'; -import something from './file.js'; - - function test(arg) { - bla(something); -} - - // This is a comment -const otherThing = "Hello"; -` - ) - - strictEqual( - getJavaScript(`import { authentication } from './authentication'`), - `import { authentication } from './authentication.js'` - ) - }) -}) diff --git a/packages/generators/test/generators.test.ts b/packages/generators/test/generators.test.ts deleted file mode 100644 index 40aa06c8d2..0000000000 --- a/packages/generators/test/generators.test.ts +++ /dev/null @@ -1,176 +0,0 @@ -/* eslint-disable @typescript-eslint/prefer-for-of */ -import os from 'os' -import path from 'path' -import { mkdtemp } from 'fs/promises' -import assert from 'assert' -import { getContext } from '@featherscloud/pinion' - -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 { generate as generateApp } from '../lib/app' -import { generate as generateConnection } from '../lib/connection' -import { generate as generateAuthentication } from '../lib/authentication' -import { generate as generateService } from '../lib/service' -import { listAllFiles } from '@featherscloud/pinion/lib/utils' -import { AuthenticationGeneratorArguments } from '../lib/authentication' - -const matrix = { - language: ['js', 'ts'] as const, - framework: ['koa', 'express'] as const, - schema: ['typebox', 'json'] as const -} - -const defaultCombination = { - language: process.env.FEATHERS_LANGUAGE || 'ts', - framework: process.env.FEATHERS_FRAMEWORK || 'koa', - schema: process.env.FEATHERS_SCHEMA || 'typebox' -} - -const combinations = - process.version > 'v16.0.0' ? (process.env.CI ? combinate(matrix as any) : [defaultCombination]) : [] - -describe('@feathersjs/generators', () => { - for (const { language, framework, schema } of combinations) { - describe(`${language} ${framework} app`, () => { - const name = `feathers_${language}_${framework}_${schema}` - - let context: FeathersBaseContext - let cwd: string - - before(async () => { - cwd = await mkdtemp(path.join(os.tmpdir(), name + '-')) - console.log(`\nGenerating test application to\n${cwd}\n\n`) - - try { - context = await generateApp( - getContext( - { - name, - framework, - language, - dependencyVersions, - client: true, - lib: 'src', - description: 'A Feathers test app', - packager: 'npm', - database: 'sqlite', - connectionString: `${name}.sqlite`, - transports: ['rest', 'websockets'], - schema - }, - { cwd } - ) - ) - } catch (error: any) { - console.error(error.stack) - console.error((await listAllFiles(cwd)).join('\n')) - throw error - } - }) - - it('generated app with SQLite and passes tests', async () => { - const testResult = await context.pinion.exec('npm', ['test'], { cwd }) - - assert.ok(context) - assert.strictEqual(testResult, 0) - }) - - it('generates authentication with SQLite and passes tests', async () => { - const authContext = await generateAuthentication( - getContext( - { - dependencyVersions, - authStrategies: ['local', 'github'], - service: 'user', - path: 'users', - type: 'knex', - schema - }, - { cwd } - ) - ) - const testResult = await context.pinion.exec('npm', ['test'], { cwd }) - - assert.ok(authContext) - assert.strictEqual(testResult, 0) - }) - - it('generates a MongoDB connection and service and passes tests', async () => { - const connectionContext = await generateConnection( - getContext( - { - dependencyVersions, - database: 'mongodb' as const, - connectionString: `mongodb://127.0.0.1:27017/${name}` - }, - { cwd } - ) - ) - const mongoService1Context = await generateService( - getContext( - { - dependencyVersions, - name: 'testing', - path: 'path/to/test', - authentication: true, - type: 'mongodb', - schema: false - }, - { cwd } - ) - ) - const messageServiceContext = await generateService( - getContext( - { - dependencyVersions, - name: 'message', - path: 'messages', - authentication: true, - type: 'mongodb', - schema - }, - { cwd } - ) - ) - const testResult = await context.pinion.exec('npm', ['test'], { cwd }) - - assert.ok(connectionContext) - assert.ok(mongoService1Context) - assert.ok(messageServiceContext) - assert.strictEqual(testResult, 0) - }) - - it('generates a custom service and passes tests', async () => { - const customServiceContext = await generateService( - getContext( - { - dependencyVersions, - name: 'Custom', - path: 'customized', - authentication: false, - type: 'custom', - schema - }, - { cwd } - ) - ) - const testResult = await context.pinion.exec('npm', ['test'], { cwd }) - - assert.ok(customServiceContext) - assert.strictEqual(testResult, 0) - }) - - it('compiles successfully', async () => { - if (language === 'ts' && framework === 'koa') { - const testResult = await context.pinion.exec('npm', ['run', 'compile'], { cwd }) - - assert.strictEqual(testResult, 0) - } - }) - }) - } -}) diff --git a/packages/generators/test/utils.ts b/packages/generators/test/utils.ts deleted file mode 100644 index 36a196c328..0000000000 --- a/packages/generators/test/utils.ts +++ /dev/null @@ -1,36 +0,0 @@ -import path from 'path' -import pkg from '../package.json' -import { DependencyVersions } from '../src/commons' -import { readFileSync } from 'fs' - -// Set __dirname in es module -const __dirname = path.dirname(new URL(import.meta.url).pathname) - -export function combinate>(obj: O) { - let combos: { [k in keyof O]: O[k][number] }[] = [] - for (const key of Object.keys(obj)) { - const values = obj[key] - const all: any[] = [] - for (let i = 0; i < values.length; i++) { - for (let j = 0; j < (combos.length || 1); j++) { - const newCombo = { ...combos[j], [key]: values[i] } - all.push(newCombo) - } - } - combos = all - } - return combos -} - -export const dependencyVersions = Object.keys(pkg.devDependencies as any) - .filter((dep) => dep.startsWith('@feathersjs/')) - .reduce((acc, dep) => { - const [, name] = dep.split('/') - const { version } = JSON.parse( - readFileSync(path.join(__dirname, '..', '..', name, 'package.json'), 'utf8').toString() - ) - - acc[dep] = path.join(__dirname, 'build', `feathersjs-${name}-${version}.tgz`) - - return acc - }, {} as DependencyVersions) diff --git a/packages/generators/tsconfig.json b/packages/generators/tsconfig.json deleted file mode 100644 index e7a844ccb1..0000000000 --- a/packages/generators/tsconfig.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "../../tsconfig", - "include": [ - "src/**/*.ts" - ], - "compilerOptions": { - "outDir": "lib", - "module": "ESNext", - "moduleResolution": "Node" - } -} diff --git a/packages/knex/CHANGELOG.md b/packages/knex/CHANGELOG.md deleted file mode 100644 index d00305465e..0000000000 --- a/packages/knex/CHANGELOG.md +++ /dev/null @@ -1,267 +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.34](https://github.com/feathersjs/feathers/compare/v5.0.33...v5.0.34) (2025-05-03) - -### Bug Fixes - -- **knex:** Add support for extended operators in query builder ([#3578](https://github.com/feathersjs/feathers/issues/3578)) ([c355ae3](https://github.com/feathersjs/feathers/commit/c355ae3184f07b15b4a313aa64fb9e7fdd0524d5)) -- 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)) -- **knex:** Add tableOptions parameter for inheritance on knex adapter options to pass on knex builder ([#3539](https://github.com/feathersjs/feathers/issues/3539)) ([ba5621b](https://github.com/feathersjs/feathers/commit/ba5621bfe5e7ab01189b6b7bccb00891bc2b14c7)) - -## [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/knex - -## [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) - -### Bug Fixes - -- **knex:** use driver name to identify client ([#3527](https://github.com/feathersjs/feathers/issues/3527)) ([bb075ec](https://github.com/feathersjs/feathers/commit/bb075ec8beb3ac9b0a1a8aebc3c3756d970cc6a4)) - -## [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/knex - -## [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/knex - -## [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/knex - -## [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/knex - -## [5.0.25](https://github.com/feathersjs/feathers/compare/v5.0.24...v5.0.25) (2024-05-03) - -### Bug Fixes - -- **knex:** Update commited to boolean type ([#3458](https://github.com/feathersjs/feathers/issues/3458)) ([5fa4dbc](https://github.com/feathersjs/feathers/commit/5fa4dbc06d0126ac18f5643562d0b74f03502caa)) - -## [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/knex - -## [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) - -### Bug Fixes - -- **knex:** Fix Knex adapter date comparison queries ([#3429](https://github.com/feathersjs/feathers/issues/3429)) ([23bafe1](https://github.com/feathersjs/feathers/commit/23bafe1204f79ce2ab0eaaa5544fab1a3ffb5f41)) - -## [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/knex - -## [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/knex - -## [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/knex - -## [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/knex - -## [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/knex - -## [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/knex - -## [5.0.15](https://github.com/feathersjs/feathers/compare/v5.0.14...v5.0.15) (2024-01-22) - -### Bug Fixes - -- **generators:** Move generators and CLI to featherscloud/pinion ([#3386](https://github.com/feathersjs/feathers/issues/3386)) ([eb87c99](https://github.com/feathersjs/feathers/commit/eb87c9922db56c5610e5b808f3ffe033c830e2b2)) -- **knex:** Add sqlite to returning clients ([#3389](https://github.com/feathersjs/feathers/issues/3389)) ([59fb40b](https://github.com/feathersjs/feathers/commit/59fb40b9eb34950ef2dd35b7de4762f224a171f1)) - -## [5.0.14](https://github.com/feathersjs/feathers/compare/v5.0.13...v5.0.14) (2024-01-05) - -### Bug Fixes - -- **knex:** Add Error Handler to knex \_update function ([#3371](https://github.com/feathersjs/feathers/issues/3371)) ([210f103](https://github.com/feathersjs/feathers/commit/210f1037bf69c641d4fd335cd4f084cbbac0a922)) - -## [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/knex - -## [5.0.12](https://github.com/feathersjs/feathers/compare/v5.0.11...v5.0.12) (2023-11-28) - -### Bug Fixes - -- allow \_patch to modify the entire base schema ([#3300](https://github.com/feathersjs/feathers/issues/3300)) ([0f41622](https://github.com/feathersjs/feathers/commit/0f41622307589b3a0b62ac411a73e6a601bda171)) -- **knex:** Add includeTriggerModifications for MSSQL support ([#3355](https://github.com/feathersjs/feathers/issues/3355)) ([cbe44b0](https://github.com/feathersjs/feathers/commit/cbe44b0e91506ab06c86355af67f83d5197bd896)) - -## [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/knex - -## [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/knex - -## [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/knex - -## [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/knex - -## [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/knex - -## [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/knex - -## [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)) -- **knex:** Ensure that columns are selected unambigiously and avoid duplicate id selection ([#3144](https://github.com/feathersjs/feathers/issues/3144)) ([3eb7428](https://github.com/feathersjs/feathers/commit/3eb7428f888f0e8a0fbc09f5261bff3e68a0ed63)) -- **knex:** Get by id and transactions should work with params.knex ([#3146](https://github.com/feathersjs/feathers/issues/3146)) ([b172b5e](https://github.com/feathersjs/feathers/commit/b172b5ea9b461642874eb7d2ba01dc4cfc275155)) -- **knex:** Only apply default order for MSSQL ([#3145](https://github.com/feathersjs/feathers/issues/3145)) ([28c2627](https://github.com/feathersjs/feathers/commit/28c26279befea6cf43cedd3af628234b170b8c91)) - -## [5.0.1](https://github.com/feathersjs/feathers/compare/v5.0.0...v5.0.1) (2023-03-15) - -### Bug Fixes - -- **core:** Use Symbol.for to instantiate shared symbols ([#3087](https://github.com/feathersjs/feathers/issues/3087)) ([7f3fc21](https://github.com/feathersjs/feathers/commit/7f3fc2167576f228f8183568eb52b077160e8d65)) - -# [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/knex - -# [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/knex - -# [5.0.0-pre.37](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.36...v5.0.0-pre.37) (2023-02-09) - -### Bug Fixes - -- **knex:** The method getModel in the knex adapter ([#3043](https://github.com/feathersjs/feathers/issues/3043)) ([77e14dd](https://github.com/feathersjs/feathers/commit/77e14dd3f4a29adff8beb805d0e6186ead59e4fe)) - -# [5.0.0-pre.36](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.35...v5.0.0-pre.36) (2023-01-29) - -### Bug Fixes - -- **databases:** Ensure that query sanitization is not necessary when using query schemas ([#3022](https://github.com/feathersjs/feathers/issues/3022)) ([dbf514e](https://github.com/feathersjs/feathers/commit/dbf514e85d1508b95c007462a39b3cadd4ff391d)) -- **databases:** Improve documentation for adapters and allow dynamic Knex adapter options ([#3019](https://github.com/feathersjs/feathers/issues/3019)) ([66c4b5e](https://github.com/feathersjs/feathers/commit/66c4b5e72000dd03acb57fca1cad4737c85c9c9e)) -- Update all dependencies ([#3024](https://github.com/feathersjs/feathers/issues/3024)) ([283dc47](https://github.com/feathersjs/feathers/commit/283dc4798d85584bc031e6e54b83b4ea77d1edd0)) - -### Features - -- **database:** Add and to the query syntax ([#3021](https://github.com/feathersjs/feathers/issues/3021)) ([00cb0d9](https://github.com/feathersjs/feathers/commit/00cb0d9c302ae951ae007d3d6ceba33e254edd9c)) - -# [5.0.0-pre.35](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.34...v5.0.0-pre.35) (2023-01-12) - -### Bug Fixes - -- **databases:** Make sure adapter method signatures are exported properly ([#2943](https://github.com/feathersjs/feathers/issues/2943)) ([458d668](https://github.com/feathersjs/feathers/commit/458d66859e256c5854e7590f0b4a11b233fe0374)) -- **knex:** Ensure custom ids are returned on create ([#2934](https://github.com/feathersjs/feathers/issues/2934)) ([c4fa3cf](https://github.com/feathersjs/feathers/commit/c4fa3cf812d59e6e8e3831ab098bb8768c92e8f4)) - -### 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) - -### Features - -- **adapter:** Add patch data type to adapters and refactor AdapterBase usage ([#2906](https://github.com/feathersjs/feathers/issues/2906)) ([9ddc2e6](https://github.com/feathersjs/feathers/commit/9ddc2e6b028f026f939d6af68125847e5c6734b4)) -- **cli:** Use separate patch schema and types ([#2916](https://github.com/feathersjs/feathers/issues/2916)) ([7088af6](https://github.com/feathersjs/feathers/commit/7088af64a539dc7f1a016d832b77b98aaaf92603)) - -# [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/knex - -# [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/knex - -# [5.0.0-pre.31](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.30...v5.0.0-pre.31) (2022-10-12) - -### Features - -- **cli:** Generate full client test suite and improve typed client ([#2788](https://github.com/feathersjs/feathers/issues/2788)) ([57119b6](https://github.com/feathersjs/feathers/commit/57119b6bb2797f7297cf054268a248c093ecd538)) -- **cli:** Improve generated schema definitions ([#2783](https://github.com/feathersjs/feathers/issues/2783)) ([474a9fd](https://github.com/feathersjs/feathers/commit/474a9fda2107e9bcf357746320a8e00cda8182b6)) - -# [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/knex - -# [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)) -- **knex:** Fix PostgreSQL integration issues and run CI tests against pg ([#2698](https://github.com/feathersjs/feathers/issues/2698)) ([1f71d78](https://github.com/feathersjs/feathers/commit/1f71d7884656c1494004931f4979ad59d23e4ee6)) - -# [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/knex - -# [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/knex - -# [5.0.0-pre.25](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.24...v5.0.0-pre.25) (2022-06-22) - -### Bug Fixes - -- **cli:** Generator fixes to work with the new guide ([#2674](https://github.com/feathersjs/feathers/issues/2674)) ([b773fa5](https://github.com/feathersjs/feathers/commit/b773fa5dbd7ff450cfb2f7b93e64882592262712)) - -# [5.0.0-pre.24](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.23...v5.0.0-pre.24) (2022-06-21) - -### Features - -- **knex:** Add KnexJS SQL database adapter to core ([#2671](https://github.com/feathersjs/feathers/issues/2671)) ([9380fff](https://github.com/feathersjs/feathers/commit/9380fff58596e8bb90b8bb098d2795b7eadfec20)) diff --git a/packages/knex/LICENSE b/packages/knex/LICENSE deleted file mode 100644 index 7712f870f3..0000000000 --- a/packages/knex/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2024 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 -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -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 deleted file mode 100644 index 61a9eb209d..0000000000 --- a/packages/knex/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# @feathersjs/knex - -[![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/mongodb.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/mongodb) -[![Discord](https://badgen.net/badge/icon/discord?icon=discord&label)](https://discord.gg/qa8kez8QBx) - -> Feathers SQL service adapter using KnexJS - -## Installation - -``` -npm install @feathersjs/knex --save -``` - -## Documentation - -Refer to the [Feathers Knex adapter documentation](https://feathersjs.com/api/databases/knex.html) 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/knex/package.json b/packages/knex/package.json deleted file mode 100644 index 0a88a44821..0000000000 --- a/packages/knex/package.json +++ /dev/null @@ -1,75 +0,0 @@ -{ - "name": "@feathersjs/knex", - "description": "Feathers SQL service adapter using KnexJS", - "version": "5.0.34", - "homepage": "https://feathersjs.com", - "main": "lib/", - "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": ">= 14" - }, - "files": [ - "CHANGELOG.md", - "LICENSE", - "README.md", - "src/**", - "lib/**", - "*.d.ts", - "*.js" - ], - "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" - }, - "directories": { - "lib": "lib" - }, - "publishConfig": { - "access": "public" - }, - "dependencies": { - "@feathersjs/adapter-commons": "^5.0.34", - "@feathersjs/commons": "^5.0.34", - "@feathersjs/errors": "^5.0.34", - "@feathersjs/feathers": "^5.0.34" - }, - "peerDependencies": { - "knex": ">=3.1.0" - }, - "devDependencies": { - "@feathersjs/adapter-tests": "^5.0.34", - "@feathersjs/schema": "^5.0.34", - "@types/mocha": "^10.0.10", - "@types/node": "^24.1.0", - "knex": "^3.1.0", - "mocha": "^11.7.1", - "pg": "^8.16.3", - "shx": "^0.4.0", - "sqlite3": "^5.1.7", - "typescript": "^5.9.2" - }, - "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" -} diff --git a/packages/knex/src/adapter.ts b/packages/knex/src/adapter.ts deleted file mode 100644 index a9751c72a5..0000000000 --- a/packages/knex/src/adapter.ts +++ /dev/null @@ -1,374 +0,0 @@ -import { Id, NullableId, Paginated, Query } from '@feathersjs/feathers' -import { _ } from '@feathersjs/commons' -import { AdapterBase, PaginationOptions, AdapterQuery, 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' -const METHODS = { - $ne: 'whereNot', - $in: 'whereIn', - $nin: 'whereNotIn', - $or: 'orWhere', - $and: 'andWhere' -} - -const OPERATORS = { - $lt: '<', - $lte: '<=', - $gt: '>', - $gte: '>=', - $like: 'like', - $notlike: 'not like', - $ilike: 'ilike' -} - -const RETURNING_CLIENTS = ['postgresql', 'pg', 'oracledb', 'mssql', 'sqlite3'] - -export class KnexAdapter< - Result, - Data = Partial, - ServiceParams extends KnexAdapterParams = KnexAdapterParams, - PatchData = Partial -> extends AdapterBase { - schema?: string - - constructor(options: KnexAdapterOptions) { - if (!options || !options.Model) { - throw new Error('You must provide a Model (the initialized knex object)') - } - - if (typeof options.name !== 'string') { - throw new Error('No table name specified.') - } - - super({ - id: 'id', - ...options, - filters: { - ...options.filters, - $and: (value: any) => value - }, - operators: [ - ...(options.operators || []), - ...Object.keys(options.extendedOperators || {}), - '$like', - '$notlike', - '$ilike' - ] - }) - } - - get fullName() { - const { name, schema } = this.getOptions({} as ServiceParams) - return schema ? `${schema}.${name}` : name - } - - get Model() { - return this.getModel() - } - - getModel(params: ServiceParams = {} as ServiceParams) { - const { Model } = this.getOptions(params) - return Model - } - - db(params?: ServiceParams) { - const { Model, name, schema, tableOptions } = this.getOptions(params) - - if (params && params.transaction && params.transaction.trx) { - const { trx } = params.transaction - // debug('ran %s with transaction %s', fullName, id) - return schema ? (trx.withSchema(schema).table(name) as Knex.QueryBuilder) : trx(name) - } - - return schema ? (Model.withSchema(schema).table(name) as Knex.QueryBuilder) : Model(name, tableOptions) - } - - knexify(knexQuery: Knex.QueryBuilder, query: Query = {}, parentKey?: string): Knex.QueryBuilder { - const knexify = this.knexify.bind(this) - const { extendedOperators = {} } = this.getOptions({} as ServiceParams) - const operatorsMap = { - ...OPERATORS, - ...extendedOperators - } - - return Object.keys(query || {}).reduce((currentQuery, key) => { - const value = query[key] - - if (_.isObject(value) && !(value instanceof Date)) { - return knexify(currentQuery, value, key) - } - - const column = parentKey || key - const method = METHODS[key as keyof typeof METHODS] - - if (method) { - if (key === '$or' || key === '$and') { - // This will create a nested query - currentQuery.where(function (this: any) { - for (const condition of value) { - this[method](function (this: Knex.QueryBuilder) { - knexify(this, condition) - }) - } - }) - - return currentQuery - } - - return (currentQuery as any)[method](column, value) - } - - const operator = operatorsMap[key as keyof typeof operatorsMap] || '=' - - return operator === '=' - ? currentQuery.where(column, value) - : currentQuery.where(column, operator, value) - }, knexQuery) - } - - createQuery(params: ServiceParams = {} as ServiceParams) { - const { name, id } = this.getOptions(params) - const { filters, query } = this.filterQuery(params) - const builder = this.db(params) - - // $select uses a specific find syntax, so it has to come first. - if (filters.$select) { - const select = filters.$select.map((column) => (column.includes('.') ? column : `${name}.${column}`)) - // always select the id field, but make sure we only select it once - builder.select(...new Set([...select, `${name}.${id}`])) - } else { - builder.select(`${name}.*`) - } - - // build up the knex query out of the query params, include $and and $or filters - this.knexify(builder, { - ...query, - ..._.pick(filters, '$and', '$or') - }) - - // Handle $sort - if (filters.$sort) { - return Object.keys(filters.$sort).reduce( - (currentQuery, key) => currentQuery.orderBy(key, filters.$sort[key] === 1 ? 'asc' : 'desc'), - builder - ) - } - - return builder - } - - filterQuery(params: ServiceParams) { - const options = this.getOptions(params) - const { $select, $sort, $limit: _limit, $skip = 0, ...query } = (params.query || {}) as AdapterQuery - const $limit = getLimit(_limit, options.paginate) - - return { - paginate: options.paginate, - filters: { $select, $sort, $limit, $skip }, - query - } - } - - async _find(params?: ServiceParams & { paginate?: PaginationOptions }): Promise> - async _find(params?: ServiceParams & { paginate: false }): Promise - async _find(params?: ServiceParams): Promise | Result[]> - async _find(params: ServiceParams = {} as ServiceParams): Promise | Result[]> { - const { filters, paginate } = this.filterQuery(params) - const { name, id } = this.getOptions(params) - const builder = params.knex ? params.knex.clone() : this.createQuery(params) - const countBuilder = builder.clone().clearSelect().clearOrder().count(`${name}.${id} as total`) - - // Handle $limit - if (filters.$limit) { - builder.limit(filters.$limit) - } - - // Handle $skip - if (filters.$skip) { - builder.offset(filters.$skip) - } - - // provide default sorting if its not set - if (!filters.$sort && builder.client.driverName === 'mssql') { - builder.orderBy(`${name}.${id}`, 'asc') - } - - const data = filters.$limit === 0 ? [] : await builder.catch(errorHandler) - - if (paginate && paginate.default) { - const total = await countBuilder.then((count) => parseInt(count[0] ? count[0].total : 0)) - - return { - total, - limit: filters.$limit, - skip: filters.$skip || 0, - data - } - } - - return data - } - - async _findOrGet(id: NullableId, params?: ServiceParams) { - if (id !== null) { - const { name, id: idField } = this.getOptions(params) - const builder = params.knex ? params.knex.clone() : this.createQuery(params) - const idQuery = builder.andWhere(`${name}.${idField}`, '=', id).catch(errorHandler) - - return idQuery as Promise - } - - return this._find({ - ...params, - paginate: false - }) - } - - async _get(id: Id, params: ServiceParams = {} as ServiceParams): Promise { - const data = await this._findOrGet(id, params) - - if (data.length !== 1) { - throw new NotFound(`No record found for id '${id}'`) - } - - return data[0] - } - - async _create(data: Data, params?: ServiceParams): Promise - async _create(data: Data[], params?: ServiceParams): Promise - async _create(data: Data | Data[], _params?: ServiceParams): Promise - async _create( - _data: Data | Data[], - params: ServiceParams = {} as ServiceParams - ): Promise { - const data = _data as any - - if (Array.isArray(data)) { - return Promise.all(data.map((current) => this._create(current, params))) - } - - const { client } = this.db(params) - const returning = RETURNING_CLIENTS.includes(client.driverName) ? [this.id] : [] - const rows: any = await this.db(params) - .insert(data, returning, { includeTriggerModifications: true }) - .catch(errorHandler) - const id = data[this.id] || rows[0][this.id] || rows[0] - - if (!id) { - return rows as Result[] - } - - return this._get(id, { - ...params, - query: _.pick(params?.query || {}, '$select') - }) - } - - async _patch(id: null, data: PatchData | Partial, params?: ServiceParams): Promise - async _patch(id: Id, data: PatchData | Partial, params?: ServiceParams): Promise - async _patch( - id: NullableId, - data: PatchData | Partial, - _params?: ServiceParams - ): Promise - async _patch( - id: NullableId, - raw: PatchData | Partial, - params: ServiceParams = {} as ServiceParams - ): Promise { - if (id === null && !this.allowsMulti('patch', params)) { - throw new MethodNotAllowed('Can not patch multiple entries') - } - - const { name, id: idField } = this.getOptions(params) - const data = _.omit(raw, this.id) - const results = await this._findOrGet(id, { - ...params, - query: { - ...params?.query, - $select: [`${name}.${idField}`] - } - }) - const idList = results.map((current: any) => current[idField]) - const updateParams = { - ...params, - query: { - [`${name}.${idField}`]: { $in: idList }, - ...(params?.query?.$select ? { $select: params?.query?.$select } : {}) - } - } - const builder = this.createQuery(updateParams) - - await builder.update(data, [], { includeTriggerModifications: true }) - - const items = await this._findOrGet(null, updateParams) - - if (id !== null) { - if (items.length === 1) { - return items[0] - } else { - throw new NotFound(`No record found for id '${id}'`) - } - } - - return items - } - - async _update(id: Id, _data: Data, params: ServiceParams = {} as ServiceParams): Promise { - if (id === null || Array.isArray(_data)) { - throw new BadRequest("You can not replace multiple instances. Did you mean 'patch'?") - } - - const data = _.omit(_data, this.id) - const oldData = await this._get(id, params) - const newObject = Object.keys(oldData).reduce((result: any, key) => { - if (key !== this.id) { - // We don't want the id field to be changed - result[key] = data[key] === undefined ? null : data[key] - } - - return result - }, {}) - - await this.db(params) - .update(newObject, '*', { includeTriggerModifications: true }) - .where(this.id, id) - .catch(errorHandler) - - return this._get(id, params) - } - - async _remove(id: null, params?: ServiceParams): Promise - async _remove(id: Id, params?: ServiceParams): Promise - async _remove(id: NullableId, _params?: ServiceParams): Promise - async _remove(id: NullableId, params: ServiceParams = {} as ServiceParams): Promise { - if (id === null && !this.allowsMulti('remove', params)) { - throw new MethodNotAllowed('Can not remove multiple entries') - } - - const items = await this._findOrGet(id, params) - const { query } = this.filterQuery(params) - const q = this.db(params) - const idList = items.map((current: any) => current[this.id]) - - query[this.id] = { $in: idList } - - // build up the knex query out of the query params - this.knexify(q, query) - - await q.delete([], { includeTriggerModifications: true }).catch(errorHandler) - - if (id !== null) { - if (items.length === 1) { - return items[0] - } - - throw new NotFound(`No record found for id '${id}'`) - } - - return items - } -} diff --git a/packages/knex/src/declarations.ts b/packages/knex/src/declarations.ts deleted file mode 100644 index 6a4429fd89..0000000000 --- a/packages/knex/src/declarations.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { Knex } from 'knex' -import { AdapterServiceOptions, AdapterParams, AdapterQuery } from '@feathersjs/adapter-commons' - -export interface KnexAdapterOptions extends AdapterServiceOptions { - Model: Knex - name: string - schema?: string - tableOptions?: { - only?: boolean - } - extendedOperators?: { - [key: string]: string - } -} - -export interface KnexAdapterTransaction { - starting: boolean - parent?: KnexAdapterTransaction - committed?: Promise - resolve?: any - trx?: Knex.Transaction - id?: number - promise?: Promise -} - -export interface KnexAdapterParams extends AdapterParams> { - knex?: Knex.QueryBuilder - transaction?: KnexAdapterTransaction -} diff --git a/packages/knex/src/error-handler.ts b/packages/knex/src/error-handler.ts deleted file mode 100644 index 6f4e7dcdc7..0000000000 --- a/packages/knex/src/error-handler.ts +++ /dev/null @@ -1,98 +0,0 @@ -import { errors } from '@feathersjs/errors' - -export const ERROR = Symbol.for('@feathersjs/knex/error') - -export function errorHandler(error: any) { - const { message } = error - let feathersError = error - - if (error.sqlState && error.sqlState.length) { - // remove SQLSTATE marker (#) and pad/truncate SQLSTATE to 5 chars - const sqlState = ('00000' + error.sqlState.replace('#', '')).slice(-5) - - switch (sqlState.slice(0, 2)) { - case '02': - feathersError = new errors.NotFound(message) - break - case '28': - feathersError = new errors.Forbidden(message) - break - case '08': - case '0A': - case '0K': - feathersError = new errors.Unavailable(message) - break - case '20': - case '21': - case '22': - case '23': - case '24': - case '25': - case '40': - case '42': - case '70': - feathersError = new errors.BadRequest(message) - break - default: - feathersError = new errors.GeneralError(message) - } - } else if (error.code === 'SQLITE_ERROR') { - // NOTE (EK): Error codes taken from - // https://www.sqlite.org/c3ref/c_abort.html - switch (error.errno) { - case 1: - case 8: - case 18: - case 19: - case 20: - feathersError = new errors.BadRequest(message) - break - case 2: - feathersError = new errors.Unavailable(message) - break - case 3: - case 23: - feathersError = new errors.Forbidden(message) - break - case 12: - feathersError = new errors.NotFound(message) - break - default: - feathersError = new errors.GeneralError(message) - break - } - } else if (typeof error.code === 'string' && error.severity && error.routine) { - // NOTE: Error codes taken from - // https://www.postgresql.org/docs/9.6/static/errcodes-appendix.html - // Omit query information - const messages = (error.message || '').split('-') - - error.message = messages[messages.length - 1] - - switch (error.code.slice(0, 2)) { - case '22': - feathersError = new errors.NotFound(message) - break - case '23': - feathersError = new errors.BadRequest(message) - break - case '28': - feathersError = new errors.Forbidden(message) - break - case '3D': - case '3F': - case '42': - feathersError = new errors.Unprocessable(message) - break - default: - feathersError = new errors.GeneralError(message) - break - } - } else if (!(error instanceof errors.FeathersError)) { - feathersError = new errors.GeneralError(message) - } - - feathersError[ERROR] = error - - throw feathersError -} diff --git a/packages/knex/src/hooks.ts b/packages/knex/src/hooks.ts deleted file mode 100644 index fe91519c2a..0000000000 --- a/packages/knex/src/hooks.ts +++ /dev/null @@ -1,102 +0,0 @@ -import { createDebug } from '@feathersjs/commons' -import { HookContext } from '@feathersjs/feathers' -import { Knex } from 'knex' -import { KnexAdapterTransaction } from './declarations' - -const debug = createDebug('feathers-knex-transaction') - -const ROLLBACK = { rollback: true } - -export const getKnex = (context: HookContext): Knex => { - const knex = context.params?.knex - ? context.params.knex - : typeof context.service.getModel === 'function' && context.service.getModel(context.params) - - return knex && typeof knex.transaction === 'function' ? knex : undefined -} - -export const start = - () => - async (context: HookContext): Promise => { - const { transaction } = context.params - const parent = transaction - const knex: Knex = transaction ? transaction.trx : getKnex(context) - - if (!knex) { - return - } - - return new Promise((resolve, reject) => { - const transaction: KnexAdapterTransaction = { - starting: true - } - - if (parent) { - transaction.parent = parent - transaction.committed = parent.committed - } else { - transaction.committed = new Promise((resolve) => { - transaction.resolve = resolve - }) - } - - transaction.starting = true - transaction.promise = knex - .transaction((trx) => { - transaction.trx = trx - transaction.id = Date.now() - - context.params = { ...context.params, transaction } - debug('started a new transaction %s', transaction.id) - - resolve() - }) - .catch((error) => { - if (transaction.starting) { - reject(error) - } else if (error !== ROLLBACK) { - throw error - } - }) - }) - } - -export const end = () => (context: HookContext) => { - const { transaction } = context.params - - if (!transaction) { - return - } - - const { trx, id, promise, parent } = transaction - - context.params = { ...context.params, transaction: parent } - transaction.starting = false - - return trx - .commit() - .then(() => promise) - .then(() => transaction.resolve && transaction.resolve(true)) - .then(() => debug('ended transaction %s', id)) - .then(() => context) -} - -export const rollback = () => (context: HookContext) => { - const { transaction } = context.params - - if (!transaction) { - return - } - - const { trx, id, promise, parent } = transaction - - context.params = { ...context.params, transaction: parent } - transaction.starting = false - - return trx - .rollback(ROLLBACK) - .then(() => promise) - .then(() => transaction.resolve && transaction.resolve(false)) - .then(() => debug('rolled back transaction %s', id)) - .then(() => context) -} diff --git a/packages/knex/src/index.ts b/packages/knex/src/index.ts deleted file mode 100644 index 7f2c347302..0000000000 --- a/packages/knex/src/index.ts +++ /dev/null @@ -1,79 +0,0 @@ -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' - -export class KnexService< - Result = any, - Data = Partial, - ServiceParams extends Params = KnexAdapterParams, - PatchData = Partial - > - extends KnexAdapter - implements ServiceMethods, Data, ServiceParams, PatchData> -{ - async find(params?: ServiceParams & { paginate?: PaginationOptions }): Promise> - async find(params?: ServiceParams & { paginate: false }): Promise - async find(params?: ServiceParams): Promise | Result[]> - async find(params?: ServiceParams): Promise | Result[]> { - return this._find({ - ...params, - query: await this.sanitizeQuery(params) - }) - } - - async get(id: Id, params?: ServiceParams): Promise { - return this._get(id, { - ...params, - query: await this.sanitizeQuery(params) - }) - } - - async create(data: Data, params?: ServiceParams): Promise - async create(data: Data[], params?: ServiceParams): Promise - async create(data: Data | Data[], params?: ServiceParams): Promise - async create(data: Data | Data[], params?: ServiceParams): Promise { - if (Array.isArray(data) && !this.allowsMulti('create', params)) { - throw new MethodNotAllowed('Can not create multiple entries') - } - - return this._create(data, params) - } - - async update(id: Id, data: Data, params?: ServiceParams): Promise { - return this._update(id, data, { - ...params, - query: await this.sanitizeQuery(params) - }) - } - - async patch(id: Id, data: PatchData, params?: ServiceParams): Promise - async patch(id: null, data: PatchData, params?: ServiceParams): Promise - async patch(id: NullableId, data: PatchData, params?: ServiceParams): Promise - async patch(id: NullableId, data: PatchData, params?: ServiceParams): Promise { - const { $limit, ...query } = await this.sanitizeQuery(params) - - return this._patch(id, data, { - ...params, - query - }) - } - - async remove(id: Id, params?: ServiceParams): Promise - async remove(id: null, params?: ServiceParams): Promise - async remove(id: NullableId, params?: ServiceParams): Promise - async remove(id: NullableId, params?: ServiceParams): Promise { - const { $limit, ...query } = await this.sanitizeQuery(params) - - return this._remove(id, { - ...params, - query - }) - } -} diff --git a/packages/knex/test/connection.ts b/packages/knex/test/connection.ts deleted file mode 100644 index a471fa235b..0000000000 --- a/packages/knex/test/connection.ts +++ /dev/null @@ -1,32 +0,0 @@ -export default (DB: string) => { - if (DB === 'mysql') { - return { - client: 'mysql', - connection: { - host: '127.0.0.1', - user: 'root', - password: '', - database: 'feathers_knex' - } - } - } - - if (DB === 'postgres') { - return { - client: 'postgresql', - connection: { - host: 'localhost', - database: 'feathers', - user: 'postgres', - password: 'postgres' - } - } - } - - return { - client: 'sqlite3', - connection: { - filename: './db.sqlite' - } - } -} diff --git a/packages/knex/test/error-handler.test.ts b/packages/knex/test/error-handler.test.ts deleted file mode 100644 index 04723a45d1..0000000000 --- a/packages/knex/test/error-handler.test.ts +++ /dev/null @@ -1,65 +0,0 @@ -import assert from 'assert' -import { errorHandler } from '../src' - -describe('Knex Error handler', () => { - it('sqlState', () => { - assert.throws( - () => - errorHandler({ - sqlState: '#23503' - }), - { - name: 'BadRequest' - } - ) - }) - - it('sqliteError', () => { - assert.throws( - () => - errorHandler({ - code: 'SQLITE_ERROR', - errno: 1 - }), - { - name: 'BadRequest' - } - ) - assert.throws(() => errorHandler({ code: 'SQLITE_ERROR', errno: 2 }), { name: 'Unavailable' }) - assert.throws(() => errorHandler({ code: 'SQLITE_ERROR', errno: 3 }), { name: 'Forbidden' }) - assert.throws(() => errorHandler({ code: 'SQLITE_ERROR', errno: 12 }), { name: 'NotFound' }) - assert.throws(() => errorHandler({ code: 'SQLITE_ERROR', errno: 13 }), { name: 'GeneralError' }) - }) - - it('postgresqlError', () => { - assert.throws( - () => - errorHandler({ - code: '22P02', - message: 'Key (id)=(1) is not present in table "users".', - severity: 'ERROR', - routine: 'ExecConstraints' - }), - { - name: 'NotFound' - } - ) - assert.throws( - () => - errorHandler({ code: '2874', message: 'Something', severity: 'ERROR', routine: 'ExecConstraints' }), - { - name: 'Forbidden' - } - ) - assert.throws( - () => - errorHandler({ code: '3D74', message: 'Something', severity: 'ERROR', routine: 'ExecConstraints' }), - { - name: 'Unprocessable' - } - ) - assert.throws(() => errorHandler({ code: 'XYZ', severity: 'ERROR', routine: 'ExecConstraints' }), { - name: 'GeneralError' - }) - }) -}) diff --git a/packages/knex/test/index.test.ts b/packages/knex/test/index.test.ts deleted file mode 100644 index 475ec3ff16..0000000000 --- a/packages/knex/test/index.test.ts +++ /dev/null @@ -1,805 +0,0 @@ -import knex, { Knex } from 'knex' -import assert from 'assert' -import { feathers, HookContext, Service } 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' - -const testSuite = adapterTests([ - '.options', - '.events', - '._get', - '._find', - '._create', - '._update', - '._patch', - '._remove', - '.get', - '.get + $select', - '.get + id + query', - '.get + NotFound', - '.get + id + query id', - '.find', - '.remove', - '.remove + $select', - '.remove + id + query', - '.remove + multi', - '.remove + multi no pagination', - '.remove + id + query id', - '.update', - '.update + $select', - '.update + id + query', - '.update + NotFound', - '.update + query + NotFound', - '.update + id + query id', - '.patch', - '.patch + $select', - '.patch + id + query', - '.patch multiple', - '.patch multiple no pagination', - '.patch multi query same', - '.patch multi query changed', - '.patch + NotFound', - '.patch + query + NotFound', - '.patch + id + query id', - '.create', - '.create ignores query', - '.create + $select', - '.create multi', - 'internal .find', - 'internal .get', - 'internal .create', - 'internal .update', - 'internal .patch', - 'internal .remove', - '.find + equal', - '.find + equal multiple', - '.find + $sort', - '.find + $sort + string', - '.find + $limit', - '.find + $limit 0', - '.find + $skip', - '.find + $select', - '.find + $or', - '.find + $and', - '.find + $in', - '.find + $nin', - '.find + $lt', - '.find + $lte', - '.find + $gt', - '.find + $gte', - '.find + $ne', - '.find + $gt + $lt + $sort', - '.find + $or nested + $sort', - '.find + $and + $or', - 'params.adapter + paginate', - 'params.adapter + multi', - '.find + paginate', - '.find + paginate + query', - '.find + paginate + $limit + $skip', - '.find + paginate + $limit 0', - '.find + paginate + params' -]) - -const TYPE = process.env.TEST_DB || 'sqlite' -const db = knex(connection(TYPE) as any) - -// Create a public database to mimic a "schema" -const schemaName = 'public' - -const clean = async () => { - await db.schema.dropTableIfExists('todos') - await db.schema.dropTableIfExists(people.fullName) - await db.schema.createTable(people.fullName, (table) => { - table.increments('id') - table.string('name').notNullable() - table.integer('age') - table.integer('time') - table.boolean('created') - return table - }) - await db.schema.createTable('todos', (table) => { - table.increments('id') - table.string('text') - table.integer('personId') - return table - }) - await db.schema.dropTableIfExists(peopleId.fullName) - await db.schema.createTable(peopleId.fullName, (table) => { - table.increments('customid') - table.string('name') - table.integer('age') - table.integer('time') - table.boolean('created') - return table - }) - await db.schema.dropTableIfExists(peopleExtendedOps.fullName) - await db.schema.createTable(peopleExtendedOps.fullName, (table) => { - table.increments('id') - table.string('name') - table.integer('age') - table.integer('time') - table.boolean('created') - return table - }) - await db.schema.dropTableIfExists(users.fullName) - await db.schema.createTable(users.fullName, (table) => { - table.increments('id') - table.string('name') - table.integer('age') - table.integer('time') - table.boolean('created') - return table - }) -} - -const personSchema = { - $id: 'Person', - type: 'object', - additionalProperties: false, - required: ['_id', 'name', 'age'], - properties: { - id: { type: 'number' }, - name: { type: 'string' }, - age: { type: ['number', 'null'] }, - time: { type: 'string' }, - create: { type: 'boolean' } - } -} as const -const personQuery = { - $id: 'PersonQuery', - type: 'object', - additionalProperties: false, - properties: { - ...querySyntax(personSchema.properties, { - name: { - $like: { type: 'string' }, - $ilike: { type: 'string' }, - $notlike: { type: 'string' } - } - }) - } -} as const -const validator = new Ajv({ - coerceTypes: true -}) -const personQueryValidator = getValidator(personQuery, validator) - -type Person = { - id: number - name: string - age: number | null - time: string - create: boolean -} - -type Todo = { - id: number - text: string - personId: number - personName: string -} - -type ServiceTypes = { - people: KnexService - 'people-customid': KnexService - users: KnexService - todos: KnexService - 'people-extended-ops': KnexService -} - -class TodoService extends KnexService { - createQuery(params: KnexAdapterParams) { - const query = super.createQuery(params) - - query.join('people as person', 'todos.personId', 'person.id').select('person.name as personName') - - return query - } -} - -const people = new KnexService({ - Model: db, - name: 'people', - events: ['testing'] -}) - -const peopleId = new KnexService({ - Model: db, - id: 'customid', - name: 'people-customid', - events: ['testing'] -}) - -const users = new KnexService({ - Model: db, - name: 'users', - events: ['testing'] -}) - -const todos = new TodoService({ - Model: db, - name: 'todos' -}) - -const peopleExtendedOps = new KnexService({ - Model: db, - name: 'people-extended-ops', - events: ['testing'], - extendedOperators: { - $neq: '<>', // Not equal (alternative syntax) - $startsWith: 'like' // Same as $like but with a different name - } -}) - -describe('Feathers Knex Service', () => { - const app = feathers() - .hooks({ - before: [transaction.start()], - after: [transaction.end()], - error: [transaction.rollback()] - }) - .use('people', people) - .use('people-customid', peopleId) - .use('users', users) - .use('todos', todos) - .use('people-extended-ops', peopleExtendedOps) - const peopleService = app.service('people') - - peopleService.hooks({ - before: { - find: [hooks.validateQuery(personQueryValidator)] - } - }) - before(() => { - if (TYPE === 'sqlite') { - // Attach the public database to mimic a "schema" - db.schema.raw(`attach database '${schemaName}.sqlite' as ${schemaName}`) - } - }) - before(clean) - after(clean) - - describe('$like method', () => { - let charlie: Person - - beforeEach(async () => { - charlie = await peopleService.create({ - name: 'Charlie Brown', - age: 10 - }) - }) - - afterEach(() => peopleService.remove(charlie.id)) - - it('$like in query', async () => { - const data = await peopleService.find({ - paginate: false, - query: { name: { $like: '%lie%' } } - }) - - assert.strictEqual(data[0].name, 'Charlie Brown') - }) - }) - - describe('$notlike method', () => { - let hasMatch: Person - let hasNoMatch: Person - - beforeEach(async () => { - hasMatch = await peopleService.create({ - name: 'XYZabcZYX' - }) - hasNoMatch = await peopleService.create({ - name: 'XYZZYX' - }) - }) - - afterEach(() => { - peopleService.remove(hasMatch.id) - peopleService.remove(hasNoMatch.id) - }) - - it('$notlike in query', async () => { - const data = await peopleService.find({ - paginate: false, - query: { name: { $notlike: '%abc%' } } - }) - - assert.strictEqual(data.length, 1) - assert.strictEqual(data[0].name, 'XYZZYX') - }) - }) - - describe('adapter specifics', () => { - let daves: Person[] - - beforeEach(async () => { - daves = await Promise.all([ - peopleService.create({ - name: 'Ageless', - age: null - }), - peopleService.create({ - name: 'Dave', - age: 32 - }), - peopleService.create({ - name: 'Dada', - age: 1 - }) - ]) - }) - - afterEach(async () => { - try { - await peopleService.remove(daves[0].id) - await peopleService.remove(daves[1].id) - await peopleService.remove(daves[2].id) - } catch (error: unknown) {} - }) - - it('$or works properly (#120)', async () => { - const data = await peopleService.find({ - paginate: false, - query: { - name: 'Dave', - $or: [ - { - age: 1 - }, - { - age: 32 - } - ] - } - }) - - assert.strictEqual(data.length, 1) - assert.strictEqual(data[0].name, 'Dave') - assert.strictEqual(data[0].age, 32) - }) - - it('$and works properly', async () => { - const data = await peopleService.find({ - paginate: false, - query: { - $and: [ - { - $or: [{ name: 'Dave' }, { name: 'Dada' }] - }, - { - age: { $lt: 23 } - } - ] - } - }) - - assert.strictEqual(data.length, 1) - assert.strictEqual(data[0].name, 'Dada') - assert.strictEqual(data[0].age, 1) - }) - - it('where conditions support NULL values properly', async () => { - const data = await peopleService.find({ - paginate: false, - query: { - age: null - } - }) - - assert.strictEqual(data.length, 1) - assert.strictEqual(data[0].name, 'Ageless') - assert.strictEqual(data[0].age, null) - }) - - it('where conditions support NOT NULL case properly', async () => { - const data = await peopleService.find({ - paginate: false, - query: { - age: { $ne: null } - } - }) - - assert.strictEqual(data.length, 2) - assert.notStrictEqual(data[0].name, 'Ageless') - assert.notStrictEqual(data[0].age, null) - assert.notStrictEqual(data[1].name, 'Ageless') - assert.notStrictEqual(data[1].age, null) - }) - - it('where conditions support NULL values within AND conditions', async () => { - const data = await peopleService.find({ - paginate: false, - query: { - age: null, - name: 'Ageless' - } - }) - - assert.strictEqual(data.length, 1) - assert.strictEqual(data[0].name, 'Ageless') - assert.strictEqual(data[0].age, null) - }) - - it('where conditions support NULL values within OR conditions', async () => { - const data = await peopleService.find({ - paginate: false, - query: { - $or: [ - { - age: null - }, - { - name: 'Dada' - } - ] - } - }) - - assert.strictEqual(data.length, 2) - assert.notStrictEqual(data[0].name, 'Dave') - assert.notStrictEqual(data[0].age, 32) - assert.notStrictEqual(data[1].name, 'Dave') - assert.notStrictEqual(data[1].age, 32) - }) - - it('attaches the SQL error', async () => { - await assert.rejects( - () => peopleService.create({}), - (error: any) => { - assert.ok(error[ERROR]) - return true - } - ) - }) - - it('get by id works with `createQuery` as params.knex', async () => { - const knex = peopleService.createQuery() - const dave = await peopleService.get(daves[0].id, { knex }) - - assert.deepStrictEqual(dave, daves[0]) - }) - }) - - describe('hooks', () => { - type ModelStub = { getModel: () => Knex } - - afterEach(async () => { - await db('people').truncate() - }) - - it('does reject on problem with commit', async () => { - const app = feathers() - - app.hooks({ - before: transaction.start(), - after: [ - (context: HookContext) => { - const client = context.params.transaction.trx.client - const query = client.query - - client.query = (conn: any, sql: any) => { - let result = query.call(client, conn, sql) - - if (sql === 'COMMIT;') { - result = result.then(() => { - throw new TypeError('Deliberate') - }) - } - - return result - } - }, - transaction.end() - ], - error: transaction.rollback() - }) - - app.use('/people', people) - - await assert.rejects(() => app.service('/people').create({ name: 'Foo' }), { - message: 'Deliberate' - }) - }) - - it('does commit, rollback, nesting', async () => { - const app = feathers<{ - people: typeof people - test: Pick & ModelStub - }>() - - app.hooks({ - before: transaction.start(), - after: transaction.end(), - error: transaction.rollback() - }) - - app.use('people', people) - - app.use('test', { - getModel: () => db, - create: async (data: any, params) => { - const created = await app.service('people').create({ name: 'Foo' }, { ...params }) - - if (data.throw) { - throw new TypeError('Deliberate') - } - - return created - } - }) - - await assert.rejects(() => app.service('test').create({ throw: true }), { - message: 'Deliberate' - }) - - assert.strictEqual((await app.service('people').find({ paginate: false })).length, 0) - - await app.service('test').create({}) - - assert.strictEqual((await app.service('people').find({ paginate: false })).length, 1) - }) - - it('does use savepoints for nested calls', async () => { - const app = feathers<{ - people: typeof people - success: Pick & ModelStub - fail: Pick & ModelStub - test: Pick & ModelStub - }>() - - app.hooks({ - before: transaction.start(), - after: transaction.end(), - error: transaction.rollback() - }) - - app.use('people', people) - - app.use('success', { - getModel: () => db, - create: async (_data, params) => { - return app.service('people').create({ name: 'Success' }, { ...params }) - } - }) - - app.use('fail', { - getModel: () => db, - create: async (_data, params) => { - await app.service('people').create({ name: 'Fail' }, { ...params }) - throw new TypeError('Deliberate') - } - }) - - app.use('test', { - getModel: () => db, - create: async (_data, params) => { - await app.service('success').create({}, { ...params }) - await app - .service('fail') - .create({}, { ...params }) - // eslint-disable-next-line @typescript-eslint/no-empty-function - .catch(() => {}) - return [] - } - }) - - await app.service('test').create({}) - - const created = await app.service('people').find({ paginate: false }) - - assert.strictEqual(created.length, 1) - assert.ok(created[0].name) - }) - - it('allows waiting for transaction to complete', async () => { - const app = feathers<{ - people: typeof people - test: Pick & ModelStub - }>() - - let seq: string[] = [] - - app.hooks({ - before: [ - transaction.start(), - (context: HookContext) => { - seq.push(`${context.path}: waiting for trx to be committed`) - context.params.transaction.committed.then((success: any) => { - seq.push(`${context.path}: committed ${success}`) - }) - }, - async (context: HookContext) => { - seq.push(`${context.path}: another hook`) - } - ], - after: [ - transaction.end(), - (context: HookContext) => { - seq.push(`${context.path}: trx ended`) - } - ], - error: [ - transaction.rollback(), - (context: HookContext) => { - seq.push(`${context.path}: trx rolled back`) - } - ] - }) - - app.use('people', people) - - app.use('test', { - getModel: () => db, - create: async (data: any, params) => { - const peeps = await app.service('people').create({ name: 'Foo' }, { ...params }) - - if (data.throw) { - throw new TypeError('Deliberate') - } - return peeps - } - }) - - assert.deepStrictEqual(seq, []) - - await assert.rejects(() => app.service('test').create({ throw: true }), { - message: 'Deliberate' - }) - - assert.deepStrictEqual(seq, [ - 'test: waiting for trx to be committed', - 'test: another hook', - 'people: waiting for trx to be committed', - 'people: another hook', - 'people: trx ended', - 'test: committed false', - 'people: committed false', - 'test: trx rolled back' - ]) - - seq = [] - - assert.strictEqual((await app.service('people').find({ paginate: false })).length, 0) - - assert.deepStrictEqual(seq, [ - 'people: waiting for trx to be committed', - 'people: another hook', - 'people: committed true', - 'people: trx ended' - ]) - - seq = [] - - await app.service('test').create({}) - - assert.deepStrictEqual(seq, [ - 'test: waiting for trx to be committed', - 'test: another hook', - 'people: waiting for trx to be committed', - 'people: another hook', - 'people: trx ended', - 'test: committed true', - 'people: committed true', - 'test: trx ended' - ]) - - seq = [] - - assert.strictEqual((await app.service('people').find({ paginate: false })).length, 1) - - assert.deepStrictEqual(seq, [ - 'people: waiting for trx to be committed', - 'people: another hook', - 'people: committed true', - 'people: trx ended' - ]) - }) - }) - - describe('associations', () => { - const todoService = app.service('todos') - - it('create, query and get with associations, can unambigiously $select', async () => { - const dave = await peopleService.create({ - name: 'Dave', - age: 133 - }) - const todo = await todoService.create({ - text: 'Do dishes', - personId: dave.id - }) - - const [found] = await todoService.find({ - paginate: false, - query: { - 'person.age': { $gt: 100 } - } - }) - const got = await todoService.get(todo.id) - - assert.deepStrictEqual( - await todoService.get(todo.id, { - query: { $select: ['id', 'text'] } - }), - { - id: todo.id, - text: todo.text, - personName: 'Dave' - } - ) - assert.strictEqual(got.personName, dave.name) - assert.deepStrictEqual(got, todo) - assert.deepStrictEqual(found, todo) - - peopleService.remove(dave.id) - todoService.remove(todo.id) - }) - }) - - describe('extendedOperators', () => { - const extendedService = app.service('people-extended-ops') - let testData: Person[] - - beforeEach(async () => { - testData = await Promise.all([ - extendedService.create({ - name: 'StartWithA', - age: 25 - }), - extendedService.create({ - name: 'MiddleAMiddle', - age: 30 - }), - extendedService.create({ - name: 'EndWithA', - age: 35 - }) - ]) - }) - - afterEach(async () => { - try { - for (const item of testData) { - await extendedService.remove(item.id) - } - } catch (error: unknown) {} - }) - - it('supports custom operators through extendedOperators option', async () => { - // Test the $startsWith custom operator - const startsWithResults = await extendedService.find({ - paginate: false, - query: { - name: { - $startsWith: 'Start%' // LIKE operator with % wildcard - } - } - }) - - assert.strictEqual(startsWithResults.length, 1) - assert.strictEqual(startsWithResults[0].name, 'StartWithA') - - // Test that regular operators still work alongside extended ones - const combinedResults = await extendedService.find({ - paginate: false, - query: { - $and: [{ name: { $neq: 'EndWithA' } }, { age: { $gt: 26 } }] - } - }) - - assert.strictEqual(combinedResults.length, 1) - assert.strictEqual(combinedResults[0].name, 'MiddleAMiddle') - }) - }) - - testSuite(app, errors, 'users') - testSuite(app, errors, 'people') - testSuite(app, errors, 'people-customid', 'customid') - testSuite(app, errors, 'people-extended-ops') -}) diff --git a/packages/knex/test/overrides.test.ts b/packages/knex/test/overrides.test.ts deleted file mode 100644 index dcd0f1fad5..0000000000 --- a/packages/knex/test/overrides.test.ts +++ /dev/null @@ -1,132 +0,0 @@ -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' - -// const { transaction } = service.hooks - -const db = knex({ - client: 'sqlite3', - connection: { - filename: './db.sqlite' - } -}) - -const schemaName = 'overrides' - -knex({ - client: 'sqlite3', - connection: { - filename: `./${schemaName}.sqlite` - } -}) - -type Animal = { - id: number - ancestor_id: number - ancestor_name: string - name: string -} - -/** - * Override the _find() method to manipulate the knex query, and - * introduce ambiguity by the table to itself. - */ -class AnimalService extends KnexService { - async _find(params?: P & { paginate?: PaginationOptions }): Promise> - async _find(params?: P & { paginate: false }): Promise - async _find(params?: P): Promise | T[]> - async _find(params: P = {} as P): Promise | T[]> { - const knexQuery = this.createQuery(params) - knexQuery - .select('ancestors.name as ancestor_name') - .leftJoin('animals as ancestors', 'ancestors.id', '=', 'animals.ancestor_id') - params.knex = knexQuery - return super._find(params) - } -} - -const animals = new AnimalService({ - Model: db, - name: 'animals', - events: ['testing'] -}) - -function clean() { - return db.schema.dropTableIfExists(animals.fullName).then(() => { - return db.schema.createTable(animals.fullName, (table) => { - table.increments('id') - table.integer('ancestor_id') - table.string('name').notNullable() - return table - }) - }) -} - -describe('Feathers Knex Overridden Method With Self-Join', () => { - let ancestor: Animal - let animal: Animal - - const app = feathers<{ animals: AnimalService }>() - .hooks({ - before: [transaction.start()], - after: [transaction.end()], - error: [transaction.rollback()] - }) - .use('animals', animals) - const animalService = app.service('animals') - - before(() => { - return db.schema.raw(`attach database '${schemaName}.sqlite' as ${schemaName}`) - }) - before(clean) - after(clean) - - beforeEach(async () => { - ancestor = await animalService.create({ - name: 'Ape' - }) - animal = await animalService.create({ - ancestor_id: ancestor.id, - name: 'Human' - }) - }) - - it('finds properly', async () => { - const foundAnimals = await animalService.find({ - paginate: false, - query: { - $limit: 1, - ancestor_name: 'Ape' - } - }) - assert.strictEqual(foundAnimals[0].id, animal.id) - assert.strictEqual(foundAnimals[0].name, 'Human') - assert.strictEqual(foundAnimals[0].ancestor_name, 'Ape') - }) - - /** - * Previously, any query modified to include joins with ambiguous primary keys - * would yield an ambiguous column errors: - * BadRequest: select `animals`.* - * from `animals` - * left join `animals` as `ancestors` on `ancestors`.`id` = `animals`.`ancestor_id` - * where `id` in (2) - SQLITE_ERROR: ambiguous column name: id - * - * The fix involves explicitly specifying the table to query in the _patch() method - */ - it('patches without ambiguous query', async () => { - const newName = 'Homo Sapiens' - const patchedAnimal = await animalService.patch(animal.id, { name: newName }) - - assert.strictEqual(patchedAnimal.name, newName) - }) - - it('get the service model (getModel)', async () => { - const model = animalService.Model - const options = animalService.options - - assert.strictEqual(model, options.Model) - }) -}) diff --git a/packages/knex/tsconfig.json b/packages/knex/tsconfig.json deleted file mode 100644 index 316fd41336..0000000000 --- a/packages/knex/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig", - "include": [ - "src/**/*.ts" - ], - "compilerOptions": { - "outDir": "lib" - } -} diff --git a/packages/koa/CHANGELOG.md b/packages/koa/CHANGELOG.md deleted file mode 100644 index 27c81cfec6..0000000000 --- a/packages/koa/CHANGELOG.md +++ /dev/null @@ -1,351 +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.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/koa - -## [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/koa - -## [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/koa - -## [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/koa - -## [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/koa - -## [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/koa - -## [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/koa - -## [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/koa - -## [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/koa - -## [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/koa - -## [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/koa - -## [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/koa - -## [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/koa - -## [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/koa - -## [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/koa - -## [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/koa - -## [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/koa - -## [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/koa - -## [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/koa - -## [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/koa - -## [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/koa - -## [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/koa - -## [5.0.7](https://github.com/feathersjs/feathers/compare/v5.0.6...v5.0.7) (2023-07-14) - -### Bug Fixes - -- **koa:** Ensure .teardown works without a server ([#3234](https://github.com/feathersjs/feathers/issues/3234)) ([818572d](https://github.com/feathersjs/feathers/commit/818572df98456bc3e1a300e879329aa8f849be64)) - -## [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/koa - -## [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/koa - -## [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) - -### Bug Fixes - -- **koa:** Replace koa-bodyparser with koa-body ([#3093](https://github.com/feathersjs/feathers/issues/3093)) ([2456bf8](https://github.com/feathersjs/feathers/commit/2456bf882c99ae2cddd1a39bffba7e61217fc055)) - -# [5.0.0](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.38...v5.0.0) (2023-02-24) - -### Bug Fixes - -- **koa:** Make Koa app inspectable ([#3069](https://github.com/feathersjs/feathers/issues/3069)) ([4fbbfff](https://github.com/feathersjs/feathers/commit/4fbbfff2a3c625f8e6929e5a09e2cf7b739ffe11)) - -# [5.0.0-pre.38](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.37...v5.0.0-pre.38) (2023-02-17) - -### Bug Fixes - -- **koa:** Fix missing dependency on feathers ([#3061](https://github.com/feathersjs/feathers/issues/3061)) ([80dc95f](https://github.com/feathersjs/feathers/commit/80dc95ff85c9074b8f70e3ff71562f18863ef2be)) - -# [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/koa - -# [5.0.0-pre.36](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.35...v5.0.0-pre.36) (2023-01-29) - -### Bug Fixes - -- Update all dependencies ([#3024](https://github.com/feathersjs/feathers/issues/3024)) ([283dc47](https://github.com/feathersjs/feathers/commit/283dc4798d85584bc031e6e54b83b4ea77d1edd0)) - -# [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/koa - -# [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/koa - -# [5.0.0-pre.32](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.31...v5.0.0-pre.32) (2022-10-26) - -### Bug Fixes - -- **transports:** Add remaining middleware for generated apps to Koa and Express ([#2796](https://github.com/feathersjs/feathers/issues/2796)) ([0d5781a](https://github.com/feathersjs/feathers/commit/0d5781a5c72a0cbb2ec8211bfa099f0aefe115a2)) - -# [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 - -- **koa:** Only set error code for Feathers errors ([#2793](https://github.com/feathersjs/feathers/issues/2793)) ([d3ee41e](https://github.com/feathersjs/feathers/commit/d3ee41e27b0ea5d29b344d6584ab03e48d16e2b4)) - -### Features - -- **cli:** Generate full client test suite and improve typed client ([#2788](https://github.com/feathersjs/feathers/issues/2788)) ([57119b6](https://github.com/feathersjs/feathers/commit/57119b6bb2797f7297cf054268a248c093ecd538)) - -# [5.0.0-pre.30](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.29...v5.0.0-pre.30) (2022-10-07) - -### Bug Fixes - -- **core:** Ensure setup and teardown can be overriden and maintain hook functionality ([#2779](https://github.com/feathersjs/feathers/issues/2779)) ([ab580cb](https://github.com/feathersjs/feathers/commit/ab580cbcaa68d19144d86798c13bf564f9d424a6)) - -### 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) - -### Features - -- Add CORS support to oAuth, Express, Koa and generated application ([#2744](https://github.com/feathersjs/feathers/issues/2744)) ([fd218f2](https://github.com/feathersjs/feathers/commit/fd218f289f8ca4c101e9938e8683e2efef6e8131)) - -# [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/koa - -# [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/koa - -# [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/koa - -# [5.0.0-pre.24](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.23...v5.0.0-pre.24) (2022-06-21) - -### Features - -- **cli:** Add support for JavaScript to the new CLI ([#2668](https://github.com/feathersjs/feathers/issues/2668)) ([ebac587](https://github.com/feathersjs/feathers/commit/ebac587f7d00dc7607c3f546352d79f79b89a5d4)) -- **cli:** Initial Feathers v5 CLI and Pinion generator ([#2578](https://github.com/feathersjs/feathers/issues/2578)) ([7f59ae7](https://github.com/feathersjs/feathers/commit/7f59ae7f1471895ba8a82aa4702f1a23f71b7682)) - -# [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/koa - -# [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/koa - -# [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/koa - -# [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/koa - -# [5.0.0-pre.18](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.17...v5.0.0-pre.18) (2022-04-11) - -### Features - -- **core:** Add app.teardown functionality ([#2570](https://github.com/feathersjs/feathers/issues/2570)) ([fcdf524](https://github.com/feathersjs/feathers/commit/fcdf524ae1995bb59265d39f12e98b7794bed023)) -- **core:** Finalize app.teardown() functionality ([#2584](https://github.com/feathersjs/feathers/issues/2584)) ([1a166f3](https://github.com/feathersjs/feathers/commit/1a166f3ded811ecacf0ae8cb67880bc9fa2eeafa)) -- **transport-commons:** add `context.http.response` ([#2524](https://github.com/feathersjs/feathers/issues/2524)) ([5bc9d44](https://github.com/feathersjs/feathers/commit/5bc9d447043c2e2b742c73ed28ecf3b3264dd9e5)) - -# [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/koa - -# [5.0.0-pre.16](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.15...v5.0.0-pre.16) (2022-01-12) - -### Features - -- **express, koa:** make transports similar ([#2486](https://github.com/feathersjs/feathers/issues/2486)) ([26aa937](https://github.com/feathersjs/feathers/commit/26aa937c114fb8596dfefc599b1f53cead69c159)) - -# [5.0.0-pre.15](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.14...v5.0.0-pre.15) (2021-11-27) - -### Bug Fixes - -- **typescript:** Overall typing improvements ([#2478](https://github.com/feathersjs/feathers/issues/2478)) ([b8eb804](https://github.com/feathersjs/feathers/commit/b8eb804158556d9651a8607e3c3fda15e0bfd110)) - -### Features - -- **core:** add `context.http` and move `statusCode` there ([#2496](https://github.com/feathersjs/feathers/issues/2496)) ([b701bf7](https://github.com/feathersjs/feathers/commit/b701bf77fb83048aa1dffa492b3d77dd53f7b72b)) - -# [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/koa - -# [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/koa - -# [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/koa - -# [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/koa - -# [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/koa - -# [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/koa - -# [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/koa - -# [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/koa - -# [5.0.0-pre.6](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.5...v5.0.0-pre.6) (2021-08-08) - -### Bug Fixes - -- **koa:** Throw a NotFound Feathers error on missing paths ([#2415](https://github.com/feathersjs/feathers/issues/2415)) ([e013f98](https://github.com/feathersjs/feathers/commit/e013f98315d550ced6eacffd615c61bb0912b4ba)) - -# [5.0.0-pre.5](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.4...v5.0.0-pre.5) (2021-06-23) - -### Bug Fixes - -- **koa:** Use extended query parser for compatibility ([#2397](https://github.com/feathersjs/feathers/issues/2397)) ([b2944ba](https://github.com/feathersjs/feathers/commit/b2944bac3ec6d5ecc80dc518cd4e58093692db74)) - -### Features - -- **adapter-commons:** Add support for params.adapter option and move memory adapter to @feathersjs/memory ([#2367](https://github.com/feathersjs/feathers/issues/2367)) ([a43e7da](https://github.com/feathersjs/feathers/commit/a43e7da22b6b981a96d1321736ea9a0cb924fb4f)) - -# [5.0.0-pre.4](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.3...v5.0.0-pre.4) (2021-05-13) - -### Features - -- **koa:** KoaJS transport adapter ([#2315](https://github.com/feathersjs/feathers/issues/2315)) ([2554b57](https://github.com/feathersjs/feathers/commit/2554b57cf05731df58feeba9c12faab18e442107)) diff --git a/packages/koa/LICENSE b/packages/koa/LICENSE deleted file mode 100644 index 6bfc0adefc..0000000000 --- a/packages/koa/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2018 Feathers - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -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/koa/README.md b/packages/koa/README.md deleted file mode 100644 index 3f0fba26dc..0000000000 --- a/packages/koa/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# @feathersjs/koa - -[![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/koa.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/koa) -[![Discord](https://badgen.net/badge/icon/discord?icon=discord&label)](https://discord.gg/qa8kez8QBx) - -> Feathers KoaJS framework bindings and REST provider - -## Installation - -``` -npm install @feathersjs/koa --save -``` - -## Documentation - -Refer to the [Feathers Koa API documentation](https://feathersjs.com/api/koa.html) 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/koa/package.json b/packages/koa/package.json deleted file mode 100644 index 2b1eb40f3f..0000000000 --- a/packages/koa/package.json +++ /dev/null @@ -1,82 +0,0 @@ -{ - "name": "@feathersjs/koa", - "description": "Feathers KoaJS framework bindings and REST provider", - "version": "5.0.34", - "homepage": "https://feathersjs.com", - "main": "lib/", - "types": "lib/", - "keywords": [ - "feathers", - "koajs" - ], - "license": "MIT", - "repository": { - "type": "git", - "url": "git://github.com/feathersjs/feathers.git", - "directory": "packages/koa" - }, - "author": { - "name": "Feathers contributors", - "email": "hello@feathersjs.com", - "url": "https://feathersjs.com" - }, - "contributors": [], - "bugs": { - "url": "https://github.com/feathersjs/feathers/issues" - }, - "engines": { - "node": ">= 14" - }, - "files": [ - "CHANGELOG.md", - "LICENSE", - "README.md", - "src/**", - "lib/**", - "*.d.ts", - "*.js" - ], - "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" - }, - "directories": { - "lib": "lib" - }, - "publishConfig": { - "access": "public" - }, - "dependencies": { - "@feathersjs/authentication": "^5.0.34", - "@feathersjs/commons": "^5.0.34", - "@feathersjs/errors": "^5.0.34", - "@feathersjs/feathers": "^5.0.34", - "@feathersjs/transport-commons": "^5.0.34", - "@koa/cors": "^5.0.0", - "@types/koa": "^2.15.0", - "@types/koa-qs": "^2.0.3", - "@types/koa-static": "^4.0.4", - "@types/koa__cors": "^5.0.0", - "koa": "^3.0.1", - "koa-body": "^6.0.1", - "koa-compose": "^4.1.0", - "koa-qs": "^3.0.0", - "koa-static": "^5.0.0" - }, - "devDependencies": { - "@feathersjs/authentication-local": "^5.0.34", - "@feathersjs/memory": "^5.0.34", - "@feathersjs/tests": "^5.0.34", - "@types/koa-compose": "^3.2.8", - "@types/mocha": "^10.0.10", - "@types/node": "^24.1.0", - "axios": "^1.11.0", - "mocha": "^11.7.1", - "shx": "^0.4.0", - "ts-node": "^10.9.2", - "typescript": "^5.9.2" - }, - "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" -} diff --git a/packages/koa/src/authentication.ts b/packages/koa/src/authentication.ts deleted file mode 100644 index a84e99cdb2..0000000000 --- a/packages/koa/src/authentication.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { Application, HookContext } from '@feathersjs/feathers' -import { createDebug } from '@feathersjs/commons' -import { authenticate as AuthenticateHook } from '@feathersjs/authentication' - -import { Middleware } from './declarations' - -const debug = createDebug('@feathersjs/koa/authentication') - -export type AuthenticationSettings = { - service?: string - strategies?: string[] -} - -export function parseAuthentication(settings: AuthenticationSettings = {}): Middleware { - return async (ctx, next) => { - const app = ctx.app - const service = app.defaultAuthentication?.(settings.service) - - if (!service) { - return next() - } - - const config = service.configuration - const authStrategies = settings.strategies || config.parseStrategies || config.authStrategies || [] - - if (authStrategies.length === 0) { - debug('No `authStrategies` or `parseStrategies` found in authentication configuration') - return next() - } - - const authentication = await service.parse(ctx.req, ctx.res, ...authStrategies) - - if (authentication) { - debug('Parsed authentication from HTTP header', authentication) - ctx.feathers = { ...ctx.feathers, authentication } - } - - return next() - } -} - -export function authenticate(settings: string | AuthenticationSettings, ...strategies: string[]): Middleware { - const hook = AuthenticateHook(settings, ...strategies) - - return async (ctx, next) => { - const app = ctx.app as Application - const params = ctx.feathers - const context = { app, params } as HookContext - - await hook(context) - - ctx.feathers = context.params - - return next() - } -} diff --git a/packages/koa/src/declarations.ts b/packages/koa/src/declarations.ts deleted file mode 100644 index 7ae1ff50f7..0000000000 --- a/packages/koa/src/declarations.ts +++ /dev/null @@ -1,37 +0,0 @@ -import Koa, { Next } from 'koa' -import { Server } from 'http' -import { Application as FeathersApplication, HookContext, Params, RouteLookup } from '@feathersjs/feathers' -import '@feathersjs/authentication' - -export type ApplicationAddons = { - server: Server - listen(port?: number, ...args: any[]): Promise -} - -export type Application = Omit & - FeathersApplication & - ApplicationAddons - -export type FeathersKoaContext = Koa.Context & { - app: A -} - -export type Middleware = (context: FeathersKoaContext, next: Next) => any - -declare module '@feathersjs/feathers/lib/declarations' { - interface ServiceOptions { - koa?: { - before?: Middleware[] - after?: Middleware[] - composed?: Middleware - } - } -} - -declare module 'koa' { - interface ExtendableContext { - feathers?: Partial - lookup?: RouteLookup - hook?: HookContext - } -} diff --git a/packages/koa/src/handlers.ts b/packages/koa/src/handlers.ts deleted file mode 100644 index 3c1a1aa216..0000000000 --- a/packages/koa/src/handlers.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { FeathersError, NotFound } from '@feathersjs/errors' -import { FeathersKoaContext } from './declarations' - -export const errorHandler = () => async (ctx: FeathersKoaContext, next: () => Promise) => { - try { - await next() - - if (ctx.body === undefined) { - throw new NotFound(`Path ${ctx.path} not found`) - } - } catch (error: any) { - ctx.response.status = error instanceof FeathersError ? error.code : 500 - ctx.body = - typeof error.toJSON === 'function' - ? error.toJSON() - : { - message: error.message - } - } -} diff --git a/packages/koa/src/index.ts b/packages/koa/src/index.ts deleted file mode 100644 index 8969ec7ebc..0000000000 --- a/packages/koa/src/index.ts +++ /dev/null @@ -1,109 +0,0 @@ -import Koa from 'koa' -import koaQs from 'koa-qs' -import { Application as FeathersApplication } from '@feathersjs/feathers' -import { routing } from '@feathersjs/transport-commons' -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' - -export { Koa, bodyParser, cors, serveStatic } -export * from './authentication' -export * from './declarations' -export * from './handlers' -export * from './rest' - -const debug = createDebug('@feathersjs/koa') - -export function koa( - feathersApp?: FeathersApplication, - koaApp: Koa = new Koa() -): Application { - if (!feathersApp) { - return koaApp as any - } - - if (typeof feathersApp.setup !== 'function') { - throw new Error('@feathersjs/koa requires a valid Feathers application instance') - } - - const app = feathersApp as any as Application - const { listen: koaListen, use: koaUse } = koaApp - const { use: feathersUse, teardown: feathersTeardown } = feathersApp - - Object.assign(app, { - use(location: string | Koa.Middleware, ...args: any[]) { - if (typeof location === 'string') { - return (feathersUse as any).call(this, location, ...args) - } - - return koaUse.call(this, location) - }, - - async listen(port?: number, ...args: any[]) { - const server = koaListen.call(this, port, ...args) - - this.server = server - await this.setup(server) - debug('Feathers application listening') - - return server - }, - - async teardown(server?: any) { - return feathersTeardown.call(this, server).then( - () => - new Promise((resolve, reject) => { - if (this.server) { - this.server.close((e) => (e ? reject(e) : resolve(this))) - } else { - resolve(this) - } - }) - ) - } - } as Application) - - const appDescriptors = { - ...Object.getOwnPropertyDescriptors(Object.getPrototypeOf(app)), - ...Object.getOwnPropertyDescriptors(app) - } - const newDescriptors = { - ...Object.getOwnPropertyDescriptors(Object.getPrototypeOf(koaApp)), - ...Object.getOwnPropertyDescriptors(koaApp) - } - - // 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] - - if (appProp === undefined && newProp !== undefined) { - Object.defineProperty(app, prop, newProp) - } - }) - - koaQs(app as any) - - Object.getOwnPropertySymbols(koaApp).forEach((symbol) => { - const target = app as any - const source = koaApp as any - - target[symbol] = source[symbol] - }) - - // This reinitializes hooks - 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() - }) - - return app -} diff --git a/packages/koa/src/rest.ts b/packages/koa/src/rest.ts deleted file mode 100644 index 8bd08dd339..0000000000 --- a/packages/koa/src/rest.ts +++ /dev/null @@ -1,94 +0,0 @@ -import compose from 'koa-compose' -import { http } from '@feathersjs/transport-commons' -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' - -const debug = createDebug('@feathersjs/koa/rest') - -const serviceMiddleware = (): Middleware => { - return async (ctx, next) => { - const { query, headers, path, body: data, method: httpMethod } = ctx.request - const methodOverride = ctx.request.headers[http.METHOD_HEADER] as string | undefined - - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - const { service, params: { __id: id = null, ...route } = {} } = ctx.lookup! - const method = http.getServiceMethod(httpMethod, id, methodOverride) - const { methods } = getServiceOptions(service) - - debug(`Found service for path ${path}, attempting to run '${method}' service method`) - - if (!methods.includes(method) || defaultServiceMethods.includes(methodOverride)) { - const error = new MethodNotAllowed(`Method \`${method}\` is not supported by this endpoint.`) - ctx.response.status = error.code - throw error - } - - const createArguments = http.argumentsFor[method as 'get'] || http.argumentsFor.default - const params = { query, headers, route, ...ctx.feathers } - const args = createArguments({ id, data, params }) - const contextBase = createContext(service, method, { http: {} }) - ctx.hook = contextBase - - const context = await (service as any)[method](...args, contextBase) - ctx.hook = context - - const response = http.getResponse(context) - ctx.status = response.status - ctx.set(response.headers) - ctx.body = response.body - - return next() - } -} - -const servicesMiddleware = (): Middleware => { - return async (ctx, next) => { - const app = ctx.app - const lookup = app.lookup(ctx.request.path) - - if (!lookup) { - return next() - } - - ctx.lookup = lookup - - const options = getServiceOptions(lookup.service) - const middleware = options.koa.composed - - return middleware(ctx, next) - } -} - -// eslint-disable-next-line @typescript-eslint/no-empty-function -export const formatter: Middleware = (_ctx, _next) => {} - -export type RestOptions = { - formatter?: Middleware - authentication?: AuthenticationSettings -} - -export const rest = (options?: RestOptions | Middleware) => { - options = typeof options === 'function' ? { formatter: options } : options || {} - - const formatterMiddleware = options.formatter || formatter - const authenticationOptions = options.authentication - - return (app: Application) => { - app.use(parseAuthentication(authenticationOptions)) - app.use(servicesMiddleware()) - - app.mixins.push((_service, _path, options) => { - const { koa: { before = [], after = [] } = {} } = options - - const middlewares = [].concat(before, serviceMiddleware(), after, formatterMiddleware) - const middleware = compose(middlewares) - - options.koa ||= {} - options.koa.composed = middleware - }) - } -} diff --git a/packages/koa/test/app.fixture.ts b/packages/koa/test/app.fixture.ts deleted file mode 100644 index c6427fb49c..0000000000 --- a/packages/koa/test/app.fixture.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { memory } from '@feathersjs/memory' -import { feathers, Params, HookContext } 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' - -const { protect, hashPassword } = hooks -const app = koa(feathers()) -const authService = new AuthenticationService(app) - -app.use(errorHandler()) -app.use(cors()) -app.use(bodyParser()) -app.configure(rest()) -app.set('authentication', { - entity: 'user', - service: 'users', - secret: 'supersecret', - authStrategies: ['local', 'jwt'], - parseStrategies: ['jwt'], - local: { - usernameField: 'email', - passwordField: 'password' - } -}) - -authService.register('jwt', new JWTStrategy()) -authService.register('local', new LocalStrategy()) - -app.use('/authentication', authService) -app.use( - '/users', - memory({ - paginate: { - default: 10, - max: 20 - } - }) -) - -app.service('users').hooks({ - before: { - create: [hashPassword('password')] - }, - after: { - all: [protect('password')], - get: [ - (context: HookContext) => { - if (context.params.provider) { - context.result.fromGet = true - } - - return context - } - ] - } -}) - -app.use('/dummy', { - async get(id: string, params: Params) { - return { id, params } - } -}) - -app.service('dummy').hooks({ - before: [authenticate('jwt')] -}) - -export default app diff --git a/packages/koa/test/authentication.test.ts b/packages/koa/test/authentication.test.ts deleted file mode 100644 index ffdf374bf2..0000000000 --- a/packages/koa/test/authentication.test.ts +++ /dev/null @@ -1,128 +0,0 @@ -import { strict as assert } from 'assert' -import _axios from 'axios' -import { AuthenticationResult } from '@feathersjs/authentication' - -import app from './app.fixture' - -const axios = _axios.create({ - baseURL: 'http://localhost:9776/' -}) - -describe('@feathersjs/koa/authentication', () => { - const email = 'koatest@authentication.com' - const password = 'superkoa' - - let authResult: AuthenticationResult - let user: any - - before(async () => { - await app.listen(9776) - user = await app.service('users').create({ email, password }) - authResult = ( - await axios.post('/authentication', { - strategy: 'local', - password, - email - }) - ).data - }) - - after(() => app.teardown()) - - describe('service authentication', () => { - it('successful local authentication', () => { - assert.ok(authResult.accessToken) - assert.strictEqual(authResult.user.email, email) - assert.strictEqual(authResult.user.password, undefined) - }) - - it('local authentication with wrong password fails', async () => { - try { - await axios.post('/authentication', { - strategy: 'local', - password: 'wrong', - email - }) - assert.fail('Should never get here') - } catch (error: any) { - const { data } = error.response - assert.strictEqual(data.name, 'NotAuthenticated') - assert.strictEqual(data.message, 'Invalid login') - } - }) - - it('authenticating with JWT works but returns same accessToken', async () => { - const { accessToken } = authResult - - const { data } = await axios.post('/authentication', { - strategy: 'jwt', - accessToken - }) - - assert.strictEqual(data.accessToken, accessToken) - assert.strictEqual(data.authentication.strategy, 'jwt') - assert.strictEqual(data.authentication.payload.sub, user.id.toString()) - assert.strictEqual(data.user.email, email) - }) - - it('can make a protected request with Authorization header', async () => { - const { accessToken } = authResult - - const { data } = await axios.get('/dummy/dave?user[name]=thing&user[message]=hi', { - headers: { - Authorization: accessToken - } - }) - - assert.strictEqual(data.id, 'dave') - assert.deepStrictEqual(data.params.query, { - user: { - name: 'thing', - message: 'hi' - } - }) - assert.deepStrictEqual(data.params.user, user) - assert.strictEqual(data.params.authentication.accessToken, accessToken) - }) - - it('errors when there are no authStrategies and parseStrategies', async () => { - const { accessToken } = authResult - - app.get('authentication').authStrategies = [] - delete app.get('authentication').parseStrategies - - try { - await axios.get('/dummy/dave', { - headers: { - Authorization: accessToken - } - }) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.response.data.name, 'NotAuthenticated') - app.get('authentication').authStrategies = ['jwt', 'local'] - } - }) - - it('can make a protected request with Authorization header and bearer scheme', () => { - const { accessToken } = authResult - - return axios - .get('/dummy/dave', { - headers: { - Authorization: ` Bearer: ${accessToken}` - } - }) - .then((res) => { - const { - data, - data: { params } - } = res - - assert.strictEqual(data.id, 'dave') - assert.deepStrictEqual(params.user, user) - assert.strictEqual(params.authentication.accessToken, accessToken) - }) - }) - }) -}) diff --git a/packages/koa/test/index.test.ts b/packages/koa/test/index.test.ts deleted file mode 100644 index 445b140230..0000000000 --- a/packages/koa/test/index.test.ts +++ /dev/null @@ -1,219 +0,0 @@ -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' - -describe('@feathersjs/koa', () => { - let app: Application - - before(async () => { - app = koa(feathers()) - app.use(errorHandler()) - app.use(bodyParser()) - app.use(async (ctx, next) => { - if (ctx.request.path === '/middleware') { - ctx.body = { - feathers: ctx.feathers, - message: 'Hello from middleware' - } - } else { - await next() - } - }) - app.configure(rest()) - app.use('/', new Service()) - app.use('todo', new Service(), { - koa: { - after: [ - async (ctx, next) => { - const body = ctx.body as any - - if (body.id === 'custom-middleware') { - body.description = 'Description from custom middleware' - } - - await next() - } - ] - }, - methods: ['get', 'find', 'create', 'update', 'patch', 'remove', 'customMethod'] - }) - - app.hooks({ - setup: [ - async (context, next) => { - assert.ok(context.app) - await next() - } - ], - teardown: [ - async (context, next) => { - assert.ok(context.app) - await next() - } - ] - } as ApplicationHookMap) - - await app.listen(8465) - }) - - after(() => app.teardown()) - - it('throws an error when initialized with invalid application', () => { - try { - koa({} as Application) - assert.fail('Should never get here') - } catch (error: any) { - assert.equal(error.message, '@feathersjs/koa requires a valid Feathers application instance') - } - }) - - it('returns Koa instance when no Feathers app is passed', () => { - assert.ok(koa() instanceof Koa) - }) - - it('Koa wrapped and context.app are the same', async () => { - const app = koa(feathers()) - - app.use('/test', { - async get(id: Id) { - return { id } - } - }) - - app.service('test').hooks({ - before: { - get: [ - (context) => { - assert.ok(context.app === app) - } - ] - } - }) - - assert.deepStrictEqual(await app.service('test').get('testing'), { - id: 'testing' - }) - }) - - it('starts as a Koa and Feathers application', async () => { - const { data } = await axios.get('http://localhost:8465/middleware') - const todo = await app.service('todo').get('dishes', { - query: {} - }) - - assert.deepEqual(data, { - message: 'Hello from middleware', - feathers: { - provider: 'rest' - } - }) - assert.deepEqual(todo, { - id: 'dishes', - description: 'You have to do dishes!' - }) - }) - - it('supports custom service middleware', async () => { - const { data } = await axios.get('http://localhost:8465/todo/custom-middleware') - - assert.deepStrictEqual(data, { - id: 'custom-middleware', - description: 'Description from custom middleware' - }) - }) - - it('works with custom methods that are allowed', async () => { - const { data } = await axios.post( - 'http://localhost:8465/todo', - { - message: 'Custom hello' - }, - { - headers: { - 'X-Service-Method': 'customMethod' - } - } - ) - - assert.deepStrictEqual(data, { - data: { message: 'Custom hello' }, - method: 'customMethod', - provider: 'rest' - }) - - await assert.rejects( - () => - axios.post( - 'http://localhost:8465/todo', - {}, - { - headers: { - 'X-Service-Method': 'internalMethod' - } - } - ), - (error: any) => { - const { data } = error.response - - assert.strictEqual(data.code, 405) - assert.strictEqual(data.message, 'Method `internalMethod` is not supported by this endpoint.') - - return true - } - ) - }) - - it('throws a 404 NotFound JSON error', async () => { - await assert.rejects( - () => - axios.post( - 'http://localhost:8465/no/where', - {}, - { - headers: { - 'X-Service-Method': 'internalMethod', - Accept: 'application/json' - } - } - ), - (error: any) => { - const { data } = error.response - - assert.deepStrictEqual(data, { - name: 'NotFound', - message: 'Path /no/where not found', - code: 404, - className: 'not-found' - }) - - return true - } - ) - }) - - it('.teardown closes http server', async () => { - const app = koa(feathers()) - let called = false - - const server = await app.listen(8787) - - server.on('close', () => { - called = true - }) - - await app.teardown() - assert.ok(called) - }) - - it('.teardown works without server (#3224)', async () => { - const app = koa(feathers()) - - await app.teardown() - }) - - restTests('Services', 'todo', 8465) - restTests('Root service', '/', 8465) -}) diff --git a/packages/koa/tsconfig.json b/packages/koa/tsconfig.json deleted file mode 100644 index 316fd41336..0000000000 --- a/packages/koa/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig", - "include": [ - "src/**/*.ts" - ], - "compilerOptions": { - "outDir": "lib" - } -} diff --git a/packages/memory/CHANGELOG.md b/packages/memory/CHANGELOG.md deleted file mode 100644 index cc41c94e97..0000000000 --- a/packages/memory/CHANGELOG.md +++ /dev/null @@ -1,784 +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.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/memory - -## [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/memory - -## [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/memory - -## [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/memory - -## [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/memory - -## [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/memory - -## [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/memory - -## [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/memory - -## [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/memory - -## [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/memory - -## [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/memory - -## [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/memory - -## [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/memory - -## [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/memory - -## [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/memory - -## [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/memory - -## [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/memory - -## [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/memory - -## [5.0.12](https://github.com/feathersjs/feathers/compare/v5.0.11...v5.0.12) (2023-11-28) - -### Bug Fixes - -- allow \_patch to modify the entire base schema ([#3300](https://github.com/feathersjs/feathers/issues/3300)) ([0f41622](https://github.com/feathersjs/feathers/commit/0f41622307589b3a0b62ac411a73e6a601bda171)) - -## [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)) -- **memory:** Ensure correct pagination totals ([#3307](https://github.com/feathersjs/feathers/issues/3307)) ([c59e1b8](https://github.com/feathersjs/feathers/commit/c59e1b80cb43571077b035ab2bf0b44f9daa5ab8)) - -## [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/memory - -## [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/memory - -## [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/memory - -## [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/memory - -## [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/memory - -## [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/memory - -## [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)) -- **memory:** Fix memory adapter readme ([#3153](https://github.com/feathersjs/feathers/issues/3153)) ([a9d826a](https://github.com/feathersjs/feathers/commit/a9d826a7dbe7df4501fbf82a47d2c3a77ca9e0c0)) - -## [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) - -### Bug Fixes - -- **memory/mongodb:** $select as only property & force 'id' in '$select' ([#3081](https://github.com/feathersjs/feathers/issues/3081)) ([fbe3cf5](https://github.com/feathersjs/feathers/commit/fbe3cf5199e102b5aeda2ae33828d5034df3d105)) - -# [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/memory - -# [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/memory - -# [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/memory - -# [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/memory - -# [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) - -### Features - -- **adapter:** Add patch data type to adapters and refactor AdapterBase usage ([#2906](https://github.com/feathersjs/feathers/issues/2906)) ([9ddc2e6](https://github.com/feathersjs/feathers/commit/9ddc2e6b028f026f939d6af68125847e5c6734b4)) - -# [5.0.0-pre.33](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.32...v5.0.0-pre.33) (2022-11-08) - -### Bug Fixes - -- **memory:** Use for loop in \_find() for better performance ([#2844](https://github.com/feathersjs/feathers/issues/2844)) ([d6ee5f1](https://github.com/feathersjs/feathers/commit/d6ee5f1c869f0c65cb470130f35956a52356e5c3)) - -# [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/memory - -# [5.0.0-pre.31](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.30...v5.0.0-pre.31) (2022-10-12) - -### Features - -- **cli:** Generate full client test suite and improve typed client ([#2788](https://github.com/feathersjs/feathers/issues/2788)) ([57119b6](https://github.com/feathersjs/feathers/commit/57119b6bb2797f7297cf054268a248c093ecd538)) - -# [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/memory - -# [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/memory - -# [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/memory - -# [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/memory - -# [5.0.0-pre.24](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.23...v5.0.0-pre.24) (2022-06-21) - -### Features - -- **cli:** Initial Feathers v5 CLI and Pinion generator ([#2578](https://github.com/feathersjs/feathers/issues/2578)) ([7f59ae7](https://github.com/feathersjs/feathers/commit/7f59ae7f1471895ba8a82aa4702f1a23f71b7682)) - -# [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/memory - -# [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/memory - -# [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/memory - -# [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) - -### Bug Fixes - -- **adapter-commons:** Clarify adapter query filtering ([#2607](https://github.com/feathersjs/feathers/issues/2607)) ([2dac771](https://github.com/feathersjs/feathers/commit/2dac771b0a3298d6dd25994d05186701b0617718)) - -### Features - -- **mongodb:** Add feathers-mongodb adapter as @feathersjs/mongodb ([#2610](https://github.com/feathersjs/feathers/issues/2610)) ([6d43734](https://github.com/feathersjs/feathers/commit/6d43734a53db02c435cafc52a22dca414e5d0940)) -- **typescript:** Improve adapter typings ([#2605](https://github.com/feathersjs/feathers/issues/2605)) ([3b2ca0a](https://github.com/feathersjs/feathers/commit/3b2ca0a6a8e03e8390272c4d7e930b4bffdaacf5)) -- **typescript:** Improve params and query typeability ([#2600](https://github.com/feathersjs/feathers/issues/2600)) ([df28b76](https://github.com/feathersjs/feathers/commit/df28b7619161f1df5e700326f52cca1a92dc5d28)) - -### BREAKING CHANGES - -- **adapter-commons:** Changes the common adapter base class to use `sanitizeQuery` and `sanitizeData` - -# [5.0.0-pre.18](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.17...v5.0.0-pre.18) (2022-04-11) - -### Bug Fixes - -- **adapter-tests:** Add tests for pagination in multi updates ([#2472](https://github.com/feathersjs/feathers/issues/2472)) ([98a811a](https://github.com/feathersjs/feathers/commit/98a811ac605575ff812a08d0504729a5efe7a69c)) - -# [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/memory - -# [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/memory - -# [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/memory - -# [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/memory - -# [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/memory - -# [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/memory - -# [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/memory - -# [5.0.0-pre.10](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.9...v5.0.0-pre.10) (2021-09-19) - -### Features - -- **schema:** Initial version of schema definitions and resolvers ([#2441](https://github.com/feathersjs/feathers/issues/2441)) ([c57a5cd](https://github.com/feathersjs/feathers/commit/c57a5cd56699a121647be4506d8f967e6d72ecae)) - -# [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/memory - -# [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/memory - -# [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/memory - -# [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/memory - -# [5.0.0-pre.5](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.4...v5.0.0-pre.5) (2021-06-23) - -### Bug Fixes - -- Update database adapter common repository urls ([#2380](https://github.com/feathersjs/feathers/issues/2380)) ([3f4db68](https://github.com/feathersjs/feathers/commit/3f4db68d6700c7d9023ecd17d0d39893f75a19fd)) - -### Features - -- **adapter-commons:** Add support for params.adapter option and move memory adapter to @feathersjs/memory ([#2367](https://github.com/feathersjs/feathers/issues/2367)) ([a43e7da](https://github.com/feathersjs/feathers/commit/a43e7da22b6b981a96d1321736ea9a0cb924fb4f)) -- **typescript:** Allow to pass generic service options to adapter services ([#2392](https://github.com/feathersjs/feathers/issues/2392)) ([f9431f2](https://github.com/feathersjs/feathers/commit/f9431f242354f804cafb835519f98dd405ac4f0b)) - -# [5.0.0-pre.4](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.3...v5.0.0-pre.4) (2021-05-13) - -### Features - -- **koa:** KoaJS transport adapter ([#2315](https://github.com/feathersjs/feathers/issues/2315)) ([2554b57](https://github.com/feathersjs/feathers/commit/2554b57cf05731df58feeba9c12faab18e442107)) - -# [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/memory - -# [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/memory - -# [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)) - -### Features - -- Feathers v5 core refactoring and features ([#2255](https://github.com/feathersjs/feathers/issues/2255)) ([2dafb7c](https://github.com/feathersjs/feathers/commit/2dafb7ce14ba57406aeec13d10ca45b1e709bee9)) - -# [5.0.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.5.11...v5.0.0-pre.1) (2020-12-17) - -### Features - -- **memory:** Move feathers-memory into @feathersjs/memory ([#2153](https://github.com/feathersjs/feathers/issues/2153)) ([dd61fe3](https://github.com/feathersjs/feathers/commit/dd61fe371fb0502f78b8ccbe1f45a030e31ecff6)) - -# Change Log - -## [v4.1.0](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v4.1.0) (2019-10-07) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v4.0.1...v4.1.0) - -**Merged pull requests:** - -- Update all dependencies [\#104](https://github.com/feathersjs-ecosystem/feathers-memory/pull/104) ([daffl](https://github.com/daffl)) - -## [v4.0.1](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v4.0.1) (2019-09-29) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v4.0.0...v4.0.1) - -**Closed issues:** - -- An in-range update of @types/node is breaking the build 🚨 [\#101](https://github.com/feathersjs-ecosystem/feathers-memory/issues/101) -- An in-range update of webpack is breaking the build 🚨 [\#98](https://github.com/feathersjs-ecosystem/feathers-memory/issues/98) - -**Merged pull requests:** - -- Pass entity type to AdapterService\ [\#103](https://github.com/feathersjs-ecosystem/feathers-memory/pull/103) ([daffl](https://github.com/daffl)) -- Update semistandard to the latest version 🚀 [\#102](https://github.com/feathersjs-ecosystem/feathers-memory/pull/102) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update dtslint to the latest version 🚀 [\#100](https://github.com/feathersjs-ecosystem/feathers-memory/pull/100) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Greenkeeper/webpack 4.36.1 [\#99](https://github.com/feathersjs-ecosystem/feathers-memory/pull/99) ([daffl](https://github.com/daffl)) - -## [v4.0.0](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v4.0.0) (2019-07-05) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v3.0.2...v4.0.0) - -**Merged pull requests:** - -- Add TypeScript definitions and upgrade to Feathers 4 [\#97](https://github.com/feathersjs-ecosystem/feathers-memory/pull/97) ([daffl](https://github.com/daffl)) -- Update mocha to the latest version 🚀 [\#94](https://github.com/feathersjs-ecosystem/feathers-memory/pull/94) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v3.0.2](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v3.0.2) (2019-01-24) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v3.0.1...v3.0.2) - -**Closed issues:** - -- Multiple patch records [\#92](https://github.com/feathersjs-ecosystem/feathers-memory/issues/92) - -**Merged pull requests:** - -- Allow patch to update prop that is within the query [\#93](https://github.com/feathersjs-ecosystem/feathers-memory/pull/93) ([Mattchewone](https://github.com/Mattchewone)) -- Add new tests [\#91](https://github.com/feathersjs-ecosystem/feathers-memory/pull/91) ([daffl](https://github.com/daffl)) -- Update @feathersjs/adapter-commons to the latest version 🚀 [\#90](https://github.com/feathersjs-ecosystem/feathers-memory/pull/90) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v3.0.1](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v3.0.1) (2018-12-29) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v3.0.0...v3.0.1) - -**Merged pull requests:** - -- Add default params to hook-less methods [\#89](https://github.com/feathersjs-ecosystem/feathers-memory/pull/89) ([daffl](https://github.com/daffl)) - -## [v3.0.0](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v3.0.0) (2018-12-17) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v2.2.0...v3.0.0) - -**Closed issues:** - -- An in-range update of webpack is breaking the build 🚨 [\#84](https://github.com/feathersjs-ecosystem/feathers-memory/issues/84) -- An in-range update of @feathersjs/errors is breaking the build 🚨 [\#83](https://github.com/feathersjs-ecosystem/feathers-memory/issues/83) - -**Merged pull requests:** - -- Update to @feathersjs/adapter-commons and drop Node 6 [\#88](https://github.com/feathersjs-ecosystem/feathers-memory/pull/88) ([daffl](https://github.com/daffl)) -- Update semistandard to the latest version 🚀 [\#87](https://github.com/feathersjs-ecosystem/feathers-memory/pull/87) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update all dependencies and Webpack build [\#85](https://github.com/feathersjs-ecosystem/feathers-memory/pull/85) ([daffl](https://github.com/daffl)) -- Update babel-loader to the latest version 🚀 [\#81](https://github.com/feathersjs-ecosystem/feathers-memory/pull/81) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v2.2.0](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v2.2.0) (2018-08-26) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v2.1.3...v2.2.0) - -**Closed issues:** - -- Previously functional batch service no longer works when creating in-memory service [\#77](https://github.com/feathersjs-ecosystem/feathers-memory/issues/77) - -**Merged pull requests:** - -- Remove cloneDeep dependency [\#80](https://github.com/feathersjs-ecosystem/feathers-memory/pull/80) ([daffl](https://github.com/daffl)) -- Fix cloning of instances [\#79](https://github.com/feathersjs-ecosystem/feathers-memory/pull/79) ([homerjam](https://github.com/homerjam)) -- Update sift to the latest version 🚀 [\#76](https://github.com/feathersjs-ecosystem/feathers-memory/pull/76) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v2.1.3](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v2.1.3) (2018-06-11) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v2.1.2...v2.1.3) - -**Closed issues:** - -- Use with create-react-app [\#74](https://github.com/feathersjs-ecosystem/feathers-memory/issues/74) - -**Merged pull requests:** - -- Transpile all Feathers modules for distributable [\#75](https://github.com/feathersjs-ecosystem/feathers-memory/pull/75) ([saiichihashimoto](https://github.com/saiichihashimoto)) -- Update shx to the latest version 🚀 [\#73](https://github.com/feathersjs-ecosystem/feathers-memory/pull/73) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v2.1.2](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v2.1.2) (2018-06-03) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v2.1.1...v2.1.2) - -**Merged pull requests:** - -- Update uberproto to the latest version 🚀 [\#72](https://github.com/feathersjs-ecosystem/feathers-memory/pull/72) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update clone-deep to the latest version 🚀 [\#70](https://github.com/feathersjs-ecosystem/feathers-memory/pull/70) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v2.1.1](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v2.1.1) (2018-03-07) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v2.1.0...v2.1.1) - -**Closed issues:** - -- Why are all the data deleted after the server is rebooted? [\#68](https://github.com/feathersjs-ecosystem/feathers-memory/issues/68) - -**Merged pull requests:** - -- Update webpack to the latest version 🚀 [\#69](https://github.com/feathersjs-ecosystem/feathers-memory/pull/69) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update clone-deep to the latest version 🚀 [\#67](https://github.com/feathersjs-ecosystem/feathers-memory/pull/67) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update mocha to the latest version 🚀 [\#66](https://github.com/feathersjs-ecosystem/feathers-memory/pull/66) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update semistandard to the latest version 🚀 [\#65](https://github.com/feathersjs-ecosystem/feathers-memory/pull/65) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v2.1.0](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v2.1.0) (2017-12-03) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v2.0.0...v2.1.0) - -**Merged pull requests:** - -- Use namespaced module name for exporting [\#64](https://github.com/feathersjs-ecosystem/feathers-memory/pull/64) ([daffl](https://github.com/daffl)) - -## [v2.0.0](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v2.0.0) (2017-12-03) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v1.3.1...v2.0.0) - -**Merged pull requests:** - -- Client build [\#63](https://github.com/feathersjs-ecosystem/feathers-memory/pull/63) ([daffl](https://github.com/daffl)) -- Upgrade to Feathers Buzzard \(v3\) [\#62](https://github.com/feathersjs-ecosystem/feathers-memory/pull/62) ([daffl](https://github.com/daffl)) -- Update to new plugin infrastructure [\#61](https://github.com/feathersjs-ecosystem/feathers-memory/pull/61) ([daffl](https://github.com/daffl)) -- Update clone-deep to the latest version 🚀 [\#60](https://github.com/feathersjs-ecosystem/feathers-memory/pull/60) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v1.3.1](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v1.3.1) (2017-10-20) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v1.3.0...v1.3.1) - -**Closed issues:** - -- Custom $select returning `id` [\#58](https://github.com/feathersjs-ecosystem/feathers-memory/issues/58) -- Best practice for $search [\#51](https://github.com/feathersjs-ecosystem/feathers-memory/issues/51) - -**Merged pull requests:** - -- Do not select the id by default [\#59](https://github.com/feathersjs-ecosystem/feathers-memory/pull/59) ([daffl](https://github.com/daffl)) - -## [v1.3.0](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v1.3.0) (2017-10-19) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v1.2.1...v1.3.0) - -**Merged pull requests:** - -- Modified matcher to use new sift package [\#57](https://github.com/feathersjs-ecosystem/feathers-memory/pull/57) ([Mattchewone](https://github.com/Mattchewone)) -- Update mocha to the latest version 🚀 [\#56](https://github.com/feathersjs-ecosystem/feathers-memory/pull/56) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v1.2.1](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v1.2.1) (2017-09-13) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v1.2.0...v1.2.1) - -## [v1.2.0](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v1.2.0) (2017-09-13) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v1.1.0...v1.2.0) - -**Closed issues:** - -- \[RFE\] An option to set the type of the id field to String [\#54](https://github.com/feathersjs-ecosystem/feathers-memory/issues/54) - -**Merged pull requests:** - -- Deep clone objects before returning [\#55](https://github.com/feathersjs-ecosystem/feathers-memory/pull/55) ([daffl](https://github.com/daffl)) -- Update feathers-socketio to the latest version 🚀 [\#52](https://github.com/feathersjs-ecosystem/feathers-memory/pull/52) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update feathers-service-tests to the latest version 🚀 [\#50](https://github.com/feathersjs-ecosystem/feathers-memory/pull/50) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update semistandard to the latest version 🚀 [\#49](https://github.com/feathersjs-ecosystem/feathers-memory/pull/49) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update dependencies to enable Greenkeeper 🌴 [\#48](https://github.com/feathersjs-ecosystem/feathers-memory/pull/48) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v1.1.0](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v1.1.0) (2017-01-31) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v1.0.1...v1.1.0) - -**Merged pull requests:** - -- Allow to pass a custom matcher and sorter in the options [\#47](https://github.com/feathersjs-ecosystem/feathers-memory/pull/47) ([daffl](https://github.com/daffl)) -- Change `var` to `const`, fix a mistake with `feathers-memory` requiring [\#46](https://github.com/feathersjs-ecosystem/feathers-memory/pull/46) ([osenvosem](https://github.com/osenvosem)) - -## [v1.0.1](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v1.0.1) (2016-11-15) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v1.0.0...v1.0.1) - -**Merged pull requests:** - -- feathers-service-tests@0.9.1 breaks build 🚨 [\#45](https://github.com/feathersjs-ecosystem/feathers-memory/pull/45) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) - -## [v1.0.0](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v1.0.0) (2016-11-11) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v0.8.1...v1.0.0) - -**Closed issues:** - -- Support $select for gets [\#35](https://github.com/feathersjs-ecosystem/feathers-memory/issues/35) - -**Merged pull requests:** - -- Update feathers-service-tests to version 0.9.0 🚀 [\#44](https://github.com/feathersjs-ecosystem/feathers-memory/pull/44) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Update feathers-commons to version 0.8.0 🚀 [\#43](https://github.com/feathersjs-ecosystem/feathers-memory/pull/43) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) - -## [v0.8.1](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v0.8.1) (2016-11-02) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v0.8.0...v0.8.1) - -**Merged pull requests:** - -- fix $select with more than one field [\#42](https://github.com/feathersjs-ecosystem/feathers-memory/pull/42) ([t2t2](https://github.com/t2t2)) -- babel-preset-es2015@6.18.0 breaks build 🚨 [\#41](https://github.com/feathersjs-ecosystem/feathers-memory/pull/41) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Two tweaks for clean build and tests on Windows [\#38](https://github.com/feathersjs-ecosystem/feathers-memory/pull/38) ([ghost](https://github.com/ghost)) -- jshint —\> semistandard [\#37](https://github.com/feathersjs-ecosystem/feathers-memory/pull/37) ([marshallswain](https://github.com/marshallswain)) -- adding code coverage reporting [\#36](https://github.com/feathersjs-ecosystem/feathers-memory/pull/36) ([ekryski](https://github.com/ekryski)) -- Update feathers-service-tests to version 0.8.0 🚀 [\#32](https://github.com/feathersjs-ecosystem/feathers-memory/pull/32) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) - -## [v0.8.0](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v0.8.0) (2016-09-08) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v0.7.5...v0.8.0) - -**Closed issues:** - -- Remove object from memory once sent? [\#30](https://github.com/feathersjs-ecosystem/feathers-memory/issues/30) - -**Merged pull requests:** - -- Update service tests, id and events option [\#31](https://github.com/feathersjs-ecosystem/feathers-memory/pull/31) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Update mocha to version 3.0.0 🚀 [\#29](https://github.com/feathersjs-ecosystem/feathers-memory/pull/29) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) - -## [v0.7.5](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v0.7.5) (2016-07-25) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v0.7.4...v0.7.5) - -## [v0.7.4](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v0.7.4) (2016-07-21) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v0.7.3...v0.7.4) - -**Merged pull requests:** - -- Update feathers-query-filters to version 2.0.0 🚀 [\#28](https://github.com/feathersjs-ecosystem/feathers-memory/pull/28) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) - -## [v0.7.3](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v0.7.3) (2016-06-16) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v0.7.2...v0.7.3) - -**Merged pull requests:** - -- Update feathers-service-tests to version 0.6.0 🚀 [\#27](https://github.com/feathersjs-ecosystem/feathers-memory/pull/27) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) - -## [v0.7.2](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v0.7.2) (2016-06-14) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v0.7.1...v0.7.2) - -**Closed issues:** - -- Support $search [\#14](https://github.com/feathersjs-ecosystem/feathers-memory/issues/14) - -**Merged pull requests:** - -- Use the original id if it can be coerced [\#26](https://github.com/feathersjs-ecosystem/feathers-memory/pull/26) ([daffl](https://github.com/daffl)) -- mocha@2.5.0 breaks build 🚨 [\#25](https://github.com/feathersjs-ecosystem/feathers-memory/pull/25) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Update babel-plugin-add-module-exports to version 0.2.0 🚀 [\#24](https://github.com/feathersjs-ecosystem/feathers-memory/pull/24) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) - -## [v0.7.1](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v0.7.1) (2016-04-05) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v0.7.0...v0.7.1) - -## [v0.7.0](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v0.7.0) (2016-04-04) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v0.6.3...v0.7.0) - -**Merged pull requests:** - -- Move to feathers-commons utilities [\#20](https://github.com/feathersjs-ecosystem/feathers-memory/pull/20) ([daffl](https://github.com/daffl)) - -## [v0.6.3](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v0.6.3) (2016-02-25) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v0.6.2...v0.6.3) - -**Closed issues:** - -- Upgrade to lodash 4 [\#17](https://github.com/feathersjs-ecosystem/feathers-memory/issues/17) - -**Merged pull requests:** - -- Use individual Lodash methods [\#19](https://github.com/feathersjs-ecosystem/feathers-memory/pull/19) ([daffl](https://github.com/daffl)) - -## [v0.6.2](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v0.6.2) (2016-02-24) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v0.6.1...v0.6.2) - -**Merged pull requests:** - -- bumping feathers-errors version [\#16](https://github.com/feathersjs-ecosystem/feathers-memory/pull/16) ([ekryski](https://github.com/ekryski)) - -## [v0.6.1](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v0.6.1) (2016-02-22) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v0.6.0...v0.6.1) - -**Merged pull requests:** - -- Exmaple update [\#15](https://github.com/feathersjs-ecosystem/feathers-memory/pull/15) ([ekryski](https://github.com/ekryski)) - -## [v0.6.0](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v0.6.0) (2016-01-30) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v0.5.3...v0.6.0) - -**Merged pull requests:** - -- Use internal methods instead of service methods directly [\#13](https://github.com/feathersjs-ecosystem/feathers-memory/pull/13) ([daffl](https://github.com/daffl)) - -## [v0.5.3](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v0.5.3) (2016-01-23) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v0.5.2...v0.5.3) - -## [v0.5.2](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v0.5.2) (2016-01-23) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v0.5.1...v0.5.2) - -**Merged pull requests:** - -- Adding nsp check [\#12](https://github.com/feathersjs-ecosystem/feathers-memory/pull/12) ([marshallswain](https://github.com/marshallswain)) - -## [v0.5.1](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v0.5.1) (2015-12-19) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v0.5.0...v0.5.1) - -## [v0.5.0](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v0.5.0) (2015-12-03) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v0.4.1...v0.5.0) - -## [v0.4.1](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v0.4.1) (2015-12-03) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/v0.4.0...v0.4.1) - -**Merged pull requests:** - -- Use ES6 classes, Promises and support pagination [\#11](https://github.com/feathersjs-ecosystem/feathers-memory/pull/11) ([daffl](https://github.com/daffl)) - -## [v0.4.0](https://github.com/feathersjs-ecosystem/feathers-memory/tree/v0.4.0) (2015-11-07) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/0.3.4...v0.4.0) - -**Closed issues:** - -- How properly append values to an existing memory element [\#9](https://github.com/feathersjs-ecosystem/feathers-memory/issues/9) -- how to initialize memory on app startup [\#8](https://github.com/feathersjs-ecosystem/feathers-memory/issues/8) -- Add query-filter support [\#7](https://github.com/feathersjs-ecosystem/feathers-memory/issues/7) -- Remove sorting and other processing from core service [\#4](https://github.com/feathersjs-ecosystem/feathers-memory/issues/4) - -**Merged pull requests:** - -- Migrate to ES6 plugin infrastructure and shared feathers-service-tests [\#10](https://github.com/feathersjs-ecosystem/feathers-memory/pull/10) ([daffl](https://github.com/daffl)) -- Added support for simple query in find [\#6](https://github.com/feathersjs-ecosystem/feathers-memory/pull/6) ([ruimgoncalves](https://github.com/ruimgoncalves)) - -## [0.3.4](https://github.com/feathersjs-ecosystem/feathers-memory/tree/0.3.4) (2014-09-25) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/0.3.3...0.3.4) - -**Closed issues:** - -- Query and persisting Data [\#5](https://github.com/feathersjs-ecosystem/feathers-memory/issues/5) - -## [0.3.3](https://github.com/feathersjs-ecosystem/feathers-memory/tree/0.3.3) (2014-06-13) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/0.3.2...0.3.3) - -## [0.3.2](https://github.com/feathersjs-ecosystem/feathers-memory/tree/0.3.2) (2014-06-13) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/0.3.1...0.3.2) - -## [0.3.1](https://github.com/feathersjs-ecosystem/feathers-memory/tree/0.3.1) (2014-06-13) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/0.3.0...0.3.1) - -**Closed issues:** - -- Fix peer dependency [\#3](https://github.com/feathersjs-ecosystem/feathers-memory/issues/3) -- Should support `patch` service method [\#2](https://github.com/feathersjs-ecosystem/feathers-memory/issues/2) -- Need to return proper errors [\#1](https://github.com/feathersjs-ecosystem/feathers-memory/issues/1) - -## [0.3.0](https://github.com/feathersjs-ecosystem/feathers-memory/tree/0.3.0) (2014-06-05) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/0.2.1...0.3.0) - -## [0.2.1](https://github.com/feathersjs-ecosystem/feathers-memory/tree/0.2.1) (2014-06-04) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/0.2.0...0.2.1) - -## [0.2.0](https://github.com/feathersjs-ecosystem/feathers-memory/tree/0.2.0) (2014-04-22) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/0.1.2...0.2.0) - -## [0.1.2](https://github.com/feathersjs-ecosystem/feathers-memory/tree/0.1.2) (2014-04-11) - -[Full Changelog](https://github.com/feathersjs-ecosystem/feathers-memory/compare/0.1.1...0.1.2) - -## [0.1.1](https://github.com/feathersjs-ecosystem/feathers-memory/tree/0.1.1) (2014-04-11) - -\* _This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)_ diff --git a/packages/memory/LICENSE b/packages/memory/LICENSE deleted file mode 100644 index 7712f870f3..0000000000 --- a/packages/memory/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2024 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 -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -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 deleted file mode 100644 index c694686789..0000000000 --- a/packages/memory/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# @feathersjs/memory - -[![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/memory.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/memory) -[![Discord](https://badgen.net/badge/icon/discord?icon=discord&label)](https://discord.gg/qa8kez8QBx) - -> A Feathers service adapter for in-memory data storage that works on all platforms. - -## Installation - -```bash -$ npm install --save @feathersjs/memory -``` - -## Documentation - -See [FeathersJS Memory Adapter API documentation](https://feathersjs.com/api/databases/memory.html) 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/memory/package.json b/packages/memory/package.json deleted file mode 100644 index cc507e8dd8..0000000000 --- a/packages/memory/package.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "name": "@feathersjs/memory", - "description": "An in memory service store", - "version": "5.0.34", - "homepage": "https://github.com/feathersjs/feathers", - "main": "lib/", - "types": "lib/", - "keywords": [ - "feathers", - "feathers-plugin" - ], - "license": "MIT", - "repository": { - "type": "git", - "url": "git://github.com/feathersjs/feathers.git", - "directory": "packages/memory" - }, - "author": { - "name": "Feathers contributors", - "email": "hello@feathersjs.com", - "url": "https://feathersjs.com" - }, - "contributors": [], - "bugs": { - "url": "https://github.com/feathersjs/feathers/issues" - }, - "engines": { - "node": ">= 12" - }, - "files": [ - "CHANGELOG.md", - "LICENSE", - "README.md", - "_templates/**", - "src/**", - "lib/**", - "*.js" - ], - "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" - }, - "publishConfig": { - "access": "public" - }, - "directories": { - "lib": "lib" - }, - "dependencies": { - "@feathersjs/adapter-commons": "^5.0.34", - "@feathersjs/commons": "^5.0.34", - "@feathersjs/errors": "^5.0.34", - "sift": "^17.1.3" - }, - "devDependencies": { - "@feathersjs/adapter-tests": "^5.0.34", - "@feathersjs/feathers": "^5.0.34", - "@types/mocha": "^10.0.10", - "@types/node": "^24.1.0", - "mocha": "^11.7.1", - "shx": "^0.4.0", - "ts-node": "^10.9.2", - "typescript": "^5.9.2" - }, - "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" -} diff --git a/packages/memory/src/index.ts b/packages/memory/src/index.ts deleted file mode 100644 index 543592aec1..0000000000 --- a/packages/memory/src/index.ts +++ /dev/null @@ -1,328 +0,0 @@ -import { BadRequest, MethodNotAllowed, NotFound } from '@feathersjs/errors' -import { _ } from '@feathersjs/commons' -import { - sorter, - select, - AdapterBase, - AdapterServiceOptions, - PaginationOptions, - AdapterParams -} from '@feathersjs/adapter-commons' -import sift from 'sift' -import { NullableId, Id, Params, Paginated } from '@feathersjs/feathers' - -export interface MemoryServiceStore { - [key: string]: T -} - -export interface MemoryServiceOptions extends AdapterServiceOptions { - store?: MemoryServiceStore - startId?: number - matcher?: (query: any) => any - sorter?: (sort: any) => any -} - -const _select = (data: any, params: any, ...args: string[]) => { - const base = select(params, ...args) - - return base(JSON.parse(JSON.stringify(data))) -} - -export class MemoryAdapter< - Result = any, - Data = Partial, - ServiceParams extends Params = Params, - PatchData = Partial -> extends AdapterBase> { - store: MemoryServiceStore - _uId: number - - constructor(options: MemoryServiceOptions = {}) { - super({ - id: 'id', - matcher: sift, - sorter, - store: {}, - startId: 0, - ...options - }) - this._uId = this.options.startId - this.store = { ...this.options.store } - } - - async getEntries(_params?: ServiceParams) { - const params = _params || ({} as ServiceParams) - - return this._find({ - ...params, - paginate: false - }) - } - - getQuery(params: ServiceParams) { - const { $skip, $sort, $limit, $select, ...query } = params.query || {} - - return { - query, - filters: { $skip, $sort, $limit, $select } - } - } - - async _find(_params?: ServiceParams & { paginate?: PaginationOptions }): Promise> - async _find(_params?: ServiceParams & { paginate: false }): Promise - async _find(_params?: ServiceParams): Promise | Result[]> - async _find(params: ServiceParams = {} as ServiceParams): Promise | Result[]> { - const { paginate } = this.getOptions(params) - const { query, filters } = this.getQuery(params) - - let values = _.values(this.store) - const hasSkip = filters.$skip !== undefined - const hasSort = filters.$sort !== undefined - const hasLimit = filters.$limit !== undefined - const hasQuery = _.keys(query).length > 0 - - if (hasSort) { - values.sort(this.options.sorter(filters.$sort)) - } - - if (paginate) { - if (hasQuery) { - values = values.filter(this.options.matcher(query)) - } - - const total = values.length - - if (hasSkip) { - values = values.slice(filters.$skip) - } - - if (hasLimit) { - values = values.slice(0, filters.$limit) - } - - const result: Paginated = { - total, - limit: filters.$limit, - skip: filters.$skip || 0, - data: values.map((value) => _select(value, params, this.id)) - } - - return result - } - - /* Without pagination, we don't have to match every result and gain considerable performance improvements with a breaking for loop. */ - if (hasQuery || hasLimit || hasSkip) { - let skipped = 0 - const matcher = this.options.matcher(query) - const matched = [] - - if (hasLimit && filters.$limit === 0) { - return [] - } - - for (let index = 0, length = values.length; index < length; index++) { - const value = values[index] - - if (hasQuery && !matcher(value, index, values)) { - continue - } - - if (hasSkip && filters.$skip > skipped) { - skipped++ - continue - } - - matched.push(_select(value, params, this.id)) - - if (hasLimit && filters.$limit === matched.length) { - break - } - } - - return matched - } - - return values.map((value) => _select(value, params, this.id)) - } - - async _get(id: Id, params: ServiceParams = {} as ServiceParams): Promise { - const { query } = this.getQuery(params) - - if (id in this.store) { - const value = this.store[id] - - if (this.options.matcher(query)(value)) { - return _select(value, params, this.id) - } - } - - throw new NotFound(`No record found for id '${id}'`) - } - - async _create(data: Partial, params?: ServiceParams): Promise - async _create(data: Partial[], params?: ServiceParams): Promise - async _create(data: Partial | Partial[], _params?: ServiceParams): Promise - async _create( - data: Partial | Partial[], - params: ServiceParams = {} as ServiceParams - ): Promise { - if (Array.isArray(data)) { - return Promise.all(data.map((current) => this._create(current, params))) - } - - const id = (data as any)[this.id] || this._uId++ - const current = _.extend({}, data, { [this.id]: id }) - const result = (this.store[id] = current) - - return _select(result, params, this.id) as Result - } - - async _update(id: Id, data: Data, params: ServiceParams = {} as ServiceParams): Promise { - if (id === null || Array.isArray(data)) { - throw new BadRequest("You can not replace multiple instances. Did you mean 'patch'?") - } - - const oldEntry = await this._get(id) - // We don't want our id to change type if it can be coerced - const oldId = (oldEntry as any)[this.id] - - // eslint-disable-next-line eqeqeq - id = oldId == id ? oldId : id - - this.store[id] = _.extend({}, data, { [this.id]: id }) - - return this._get(id, params) - } - - async _patch(id: null, data: PatchData | Partial, params?: ServiceParams): Promise - async _patch(id: Id, data: PatchData | Partial, params?: ServiceParams): Promise - async _patch( - id: NullableId, - data: PatchData | Partial, - _params?: ServiceParams - ): Promise - async _patch( - id: NullableId, - data: PatchData | Partial, - params: ServiceParams = {} as ServiceParams - ): Promise { - if (id === null && !this.allowsMulti('patch', params)) { - throw new MethodNotAllowed('Can not patch multiple entries') - } - - const { query } = this.getQuery(params) - const patchEntry = (entry: Result) => { - const currentId = (entry as any)[this.id] - - this.store[currentId] = _.extend(this.store[currentId], _.omit(data, this.id)) - - return _select(this.store[currentId], params, this.id) - } - - if (id === null) { - const entries = await this.getEntries({ - ...params, - query - }) - - return entries.map(patchEntry) - } - - return patchEntry(await this._get(id, params)) // Will throw an error if not found - } - - async _remove(id: null, params?: ServiceParams): Promise - async _remove(id: Id, params?: ServiceParams): Promise - async _remove(id: NullableId, _params?: ServiceParams): Promise - async _remove(id: NullableId, params: ServiceParams = {} as ServiceParams): Promise { - if (id === null && !this.allowsMulti('remove', params)) { - throw new MethodNotAllowed('Can not remove multiple entries') - } - - const { query } = this.getQuery(params) - - if (id === null) { - const entries = await this.getEntries({ - ...params, - query - }) - - return Promise.all(entries.map((current: any) => this._remove(current[this.id] as Id, params))) - } - - const entry = await this._get(id, params) - - delete this.store[id] - - return entry - } -} - -export class MemoryService< - Result = any, - Data = Partial, - ServiceParams extends AdapterParams = AdapterParams, - PatchData = Partial -> extends MemoryAdapter { - async find(params?: ServiceParams & { paginate?: PaginationOptions }): Promise> - async find(params?: ServiceParams & { paginate: false }): Promise - async find(params?: ServiceParams): Promise | Result[]> - async find(params?: ServiceParams): Promise | Result[]> { - return this._find({ - ...params, - query: await this.sanitizeQuery(params) - }) - } - - async get(id: Id, params?: ServiceParams): Promise { - return this._get(id, { - ...params, - query: await this.sanitizeQuery(params) - }) - } - - async create(data: Data, params?: ServiceParams): Promise - async create(data: Data[], params?: ServiceParams): Promise - async create(data: Data | Data[], params?: ServiceParams): Promise { - if (Array.isArray(data) && !this.allowsMulti('create', params)) { - throw new MethodNotAllowed('Can not create multiple entries') - } - - return this._create(data, params) - } - - async update(id: Id, data: Data, params?: ServiceParams): Promise { - return this._update(id, data, { - ...params, - query: await this.sanitizeQuery(params) - }) - } - - async patch(id: Id, data: PatchData, params?: ServiceParams): Promise - async patch(id: null, data: PatchData, params?: ServiceParams): Promise - async patch(id: NullableId, data: PatchData, params?: ServiceParams): Promise { - const { $limit, ...query } = await this.sanitizeQuery(params) - - return this._patch(id, data, { - ...params, - query - }) - } - - async remove(id: Id, params?: ServiceParams): Promise - async remove(id: null, params?: ServiceParams): Promise - async remove(id: NullableId, params?: ServiceParams): Promise { - const { $limit, ...query } = await this.sanitizeQuery(params) - - return this._remove(id, { - ...params, - query - }) - } -} - -export function memory, P extends Params = Params>( - options: Partial> = {} -) { - return new MemoryService(options) -} diff --git a/packages/memory/test/index.test.ts b/packages/memory/test/index.test.ts deleted file mode 100644 index 1b25ba59a0..0000000000 --- a/packages/memory/test/index.test.ts +++ /dev/null @@ -1,280 +0,0 @@ -import assert from 'assert' -import adapterTests from '@feathersjs/adapter-tests' -import errors from '@feathersjs/errors' -import { feathers } from '@feathersjs/feathers' - -import { MemoryService } from '../src' - -const testSuite = adapterTests([ - '.options', - '.events', - '._get', - '._find', - '._create', - '._update', - '._patch', - '._remove', - '.get', - '.get + $select', - '.get + id + query', - '.get + NotFound', - '.get + id + query id', - '.find', - '.find + paginate + query', - '.remove', - '.remove + $select', - '.remove + id + query', - '.remove + multi', - '.remove + multi no pagination', - '.remove + id + query id', - '.update', - '.update + $select', - '.update + id + query', - '.update + NotFound', - '.update + id + query id', - '.update + query + NotFound', - '.patch', - '.patch + $select', - '.patch + id + query', - '.patch multiple', - '.patch multiple no pagination', - '.patch multi query same', - '.patch multi query changed', - '.patch + query + NotFound', - '.patch + NotFound', - '.patch + id + query id', - '.create', - '.create + $select', - '.create multi', - 'internal .find', - 'internal .get', - 'internal .create', - 'internal .update', - 'internal .patch', - 'internal .remove', - '.find + equal', - '.find + equal multiple', - '.find + $sort', - '.find + $sort + string', - '.find + $limit', - '.find + $limit 0', - '.find + $skip', - '.find + $select', - '.find + $or', - '.find + $in', - '.find + $nin', - '.find + $lt', - '.find + $lte', - '.find + $gt', - '.find + $gte', - '.find + $ne', - '.find + $gt + $lt + $sort', - '.find + $or nested + $sort', - '.find + paginate', - '.find + paginate + $limit + $skip', - '.find + paginate + $limit 0', - '.find + paginate + params', - 'params.adapter + paginate', - 'params.adapter + multi' -]) - -describe('Feathers Memory Service', () => { - type Person = { - id: number - name: string - age: number - } - - type Animal = { - type: string - age: number - } - - const events = ['testing'] - const app = feathers<{ - people: MemoryService - 'people-paginate': MemoryService - 'people-customid': MemoryService - animals: MemoryService - matcher: MemoryService - }>() - - app.use( - 'people', - new MemoryService({ - events - }) - ) - - app.use( - 'people-paginate', - new MemoryService({ - events, - multi: true, - paginate: { - default: 10, - max: 100 - } - }) - ) - - app.use( - 'people-customid', - new MemoryService({ - id: 'customid', - events - }) - ) - - it('update with string id works', async () => { - const people = app.service('people') - const person = await people.create({ - name: 'Tester', - age: 33 - }) - - const updatedPerson: any = await people.update(person.id.toString(), person) - - assert.strictEqual(typeof updatedPerson.id, 'number') - - await people.remove(person.id.toString()) - }) - - it('patch record with prop also in query', async () => { - app.use('animals', new MemoryService({ multi: true })) - const animals = app.service('animals') - await animals.create([ - { - type: 'cat', - age: 30 - }, - { - type: 'dog', - age: 10 - } - ]) - - const [updated] = await animals.patch(null, { age: 40 }, { query: { age: 30 } }) - - assert.strictEqual(updated.age, 40) - - await animals.remove(null, {}) - }) - - it('allows to pass custom find and sort matcher', async () => { - let sorterCalled = false - let matcherCalled = false - - app.use( - 'matcher', - new MemoryService({ - matcher() { - matcherCalled = true - return function () { - return true - } - }, - - sorter() { - sorterCalled = true - return function () { - return 0 - } - } - }) - ) - - await app.service('matcher').find({ - query: { something: 1, $sort: { something: 1 } } - }) - - assert.ok(sorterCalled, 'sorter called') - assert.ok(matcherCalled, 'matcher called') - }) - - it('does not modify the original data', async () => { - const people = app.service('people') - - const person = await people.create({ - name: 'Delete tester', - age: 33 - }) - - delete person.age - - const otherPerson = await people.get(person.id) - - assert.strictEqual(otherPerson.age, 33) - - await people.remove(person.id) - }) - - it('update with null throws error', async () => { - try { - await app.service('people').update(null, {}) - throw new Error('Should never get here') - } catch (error: any) { - assert.strictEqual(error.message, "You can not replace multiple instances. Did you mean 'patch'?") - } - }) - - it('use $select as only query property', async () => { - const people = app.service('people') - const person = await people.create({ - name: 'Tester', - age: 42 - }) - - const results = await people.find({ - paginate: false, - query: { - $select: ['name'] - } - }) - - assert.deepStrictEqual(results[0], { id: person.id, name: 'Tester' }) - - await people.remove(person.id) - }) - - it('using $limit still returns correct total', async () => { - const service = app.service('people-paginate') - - for (let i = 0; i < 10; i++) { - await service.create({ - name: `Tester ${i}`, - age: 19 - }) - - await service.create({ - name: `Tester ${i}`, - age: 20 - }) - } - - try { - const results = await service.find({ - query: { - $skip: 3, - $limit: 5, - age: 19 - } - }) - - assert.strictEqual(results.total, 10) - assert.strictEqual(results.skip, 3) - assert.strictEqual(results.limit, 5) - } finally { - await service.remove(null, { - query: { - age: { - $in: [19, 20] - } - } - }) - } - }) - - testSuite(app, errors, 'people') - testSuite(app, errors, 'people-customid', 'customid') -}) diff --git a/packages/memory/tsconfig.json b/packages/memory/tsconfig.json deleted file mode 100644 index 316fd41336..0000000000 --- a/packages/memory/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig", - "include": [ - "src/**/*.ts" - ], - "compilerOptions": { - "outDir": "lib" - } -} diff --git a/packages/mongodb/CHANGELOG.md b/packages/mongodb/CHANGELOG.md deleted file mode 100644 index 3edbd3bc45..0000000000 --- a/packages/mongodb/CHANGELOG.md +++ /dev/null @@ -1,286 +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.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/mongodb - -## [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)) -- **mongodb:** Fix mongo count ([#3541](https://github.com/feathersjs/feathers/issues/3541)) ([3e95c7d](https://github.com/feathersjs/feathers/commit/3e95c7df6ae7de6a3a406dfb61dd044ea905456f)) - -## [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/mongodb - -## [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/mongodb - -## [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/mongodb - -## [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/mongodb - -## [5.0.26](https://github.com/feathersjs/feathers/compare/v5.0.25...v5.0.26) (2024-06-09) - -### Bug Fixes - -- **mongodb:** Added Update Method Prototype to MongoDBService Class ([#3494](https://github.com/feathersjs/feathers/issues/3494)) ([428f23a](https://github.com/feathersjs/feathers/commit/428f23a8c622cd8bc4d06253206aadd514267846)) -- **mongodb:** MongoDB Aggregation improvements ([#3366](https://github.com/feathersjs/feathers/issues/3366)) ([f2829b1](https://github.com/feathersjs/feathers/commit/f2829b1f8e33d13caae3557d37225d990467fb39)) - -## [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/mongodb - -## [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/mongodb - -## [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/mongodb - -## [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/mongodb - -## [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/mongodb - -## [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/mongodb - -## [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/mongodb - -## [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/mongodb - -## [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/mongodb - -## [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/mongodb - -## [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/mongodb - -## [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/mongodb - -## [5.0.12](https://github.com/feathersjs/feathers/compare/v5.0.11...v5.0.12) (2023-11-28) - -### Bug Fixes - -- allow \_patch to modify the entire base schema ([#3300](https://github.com/feathersjs/feathers/issues/3300)) ([0f41622](https://github.com/feathersjs/feathers/commit/0f41622307589b3a0b62ac411a73e6a601bda171)) - -## [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/mongodb - -## [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/mongodb - -## [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/mongodb - -## [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/mongodb - -## [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/mongodb - -## [5.0.5](https://github.com/feathersjs/feathers/compare/v5.0.4...v5.0.5) (2023-04-28) - -### Bug Fixes - -- **mongodb:** Speed up multi create ([#3171](https://github.com/feathersjs/feathers/issues/3171)) ([e34f728](https://github.com/feathersjs/feathers/commit/e34f728139a1008503aa440f1b7cf6395719417b)) - -## [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)) -- **mongodb:** Add MongoDB as peerDependency ([#3148](https://github.com/feathersjs/feathers/issues/3148)) ([0137b40](https://github.com/feathersjs/feathers/commit/0137b40fb694fa95e3b7b7ad41504831b894d977)) - -## [5.0.1](https://github.com/feathersjs/feathers/compare/v5.0.0...v5.0.1) (2023-03-15) - -### Bug Fixes - -- **memory/mongodb:** $select as only property & force 'id' in '$select' ([#3081](https://github.com/feathersjs/feathers/issues/3081)) ([fbe3cf5](https://github.com/feathersjs/feathers/commit/fbe3cf5199e102b5aeda2ae33828d5034df3d105)) - -# [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/mongodb - -# [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/mongodb - -# [5.0.0-pre.37](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.36...v5.0.0-pre.37) (2023-02-09) - -### Features - -- **mongodb:** Add Object ID keyword converter and update MongoDB CLI & docs ([#3041](https://github.com/feathersjs/feathers/issues/3041)) ([ca0994e](https://github.com/feathersjs/feathers/commit/ca0994eaecb5a31f310bc980d106834e11f24f41)) - -# [5.0.0-pre.36](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.35...v5.0.0-pre.36) (2023-01-29) - -### Bug Fixes - -- **databases:** Ensure that query sanitization is not necessary when using query schemas ([#3022](https://github.com/feathersjs/feathers/issues/3022)) ([dbf514e](https://github.com/feathersjs/feathers/commit/dbf514e85d1508b95c007462a39b3cadd4ff391d)) -- **databases:** Improve documentation for adapters and allow dynamic Knex adapter options ([#3019](https://github.com/feathersjs/feathers/issues/3019)) ([66c4b5e](https://github.com/feathersjs/feathers/commit/66c4b5e72000dd03acb57fca1cad4737c85c9c9e)) -- Update all dependencies ([#3024](https://github.com/feathersjs/feathers/issues/3024)) ([283dc47](https://github.com/feathersjs/feathers/commit/283dc4798d85584bc031e6e54b83b4ea77d1edd0)) - -### Features - -- **database:** Add and to the query syntax ([#3021](https://github.com/feathersjs/feathers/issues/3021)) ([00cb0d9](https://github.com/feathersjs/feathers/commit/00cb0d9c302ae951ae007d3d6ceba33e254edd9c)) - -# [5.0.0-pre.35](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.34...v5.0.0-pre.35) (2023-01-12) - -### Bug Fixes - -- **databases:** Make sure adapter method signatures are exported properly ([#2943](https://github.com/feathersjs/feathers/issues/2943)) ([458d668](https://github.com/feathersjs/feathers/commit/458d66859e256c5854e7590f0b4a11b233fe0374)) - -### 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) - -### Bug Fixes - -- **schema:** Check for undefined value in resolveQueryObjectId resolver ([#2914](https://github.com/feathersjs/feathers/issues/2914)) ([d9449fa](https://github.com/feathersjs/feathers/commit/d9449fa835f58fc9cec5f7254c50219494129140)) - -### Features - -- **adapter:** Add patch data type to adapters and refactor AdapterBase usage ([#2906](https://github.com/feathersjs/feathers/issues/2906)) ([9ddc2e6](https://github.com/feathersjs/feathers/commit/9ddc2e6b028f026f939d6af68125847e5c6734b4)) - -# [5.0.0-pre.33](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.32...v5.0.0-pre.33) (2022-11-08) - -### Features - -- **mongodb:** Add ObjectId resolvers and MongoDB option in the guide ([#2847](https://github.com/feathersjs/feathers/issues/2847)) ([c5c1fba](https://github.com/feathersjs/feathers/commit/c5c1fba5718a63412075cd3838b86b889eb0bd48)) - -# [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/mongodb - -# [5.0.0-pre.31](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.30...v5.0.0-pre.31) (2022-10-12) - -### Features - -- **cli:** Generate full client test suite and improve typed client ([#2788](https://github.com/feathersjs/feathers/issues/2788)) ([57119b6](https://github.com/feathersjs/feathers/commit/57119b6bb2797f7297cf054268a248c093ecd538)) -- **cli:** Improve generated schema definitions ([#2783](https://github.com/feathersjs/feathers/issues/2783)) ([474a9fd](https://github.com/feathersjs/feathers/commit/474a9fda2107e9bcf357746320a8e00cda8182b6)) - -# [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/mongodb - -# [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)) -- **mongodb:** Ensure transactions are used properly in create ([#2699](https://github.com/feathersjs/feathers/issues/2699)) ([fe22615](https://github.com/feathersjs/feathers/commit/fe22615b7fa17d3c20ac26d6f82097917c9b63f6)) - -# [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/mongodb - -# [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/mongodb - -# [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/mongodb - -# [5.0.0-pre.24](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.23...v5.0.0-pre.24) (2022-06-21) - -### Features - -- **authentication-local:** Add passwordHash property resolver ([#2660](https://github.com/feathersjs/feathers/issues/2660)) ([b41279b](https://github.com/feathersjs/feathers/commit/b41279b55eea3771a6fa4983a37be2413287bbc6)) -- **knex:** Add KnexJS SQL database adapter to core ([#2671](https://github.com/feathersjs/feathers/issues/2671)) ([9380fff](https://github.com/feathersjs/feathers/commit/9380fff58596e8bb90b8bb098d2795b7eadfec20)) - -# [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/mongodb - -# [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/mongodb - -# [5.0.0-pre.21](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.20...v5.0.0-pre.21) (2022-05-23) - -### Bug Fixes - -- **typescript:** Make additional types generic to work with extended types ([#2625](https://github.com/feathersjs/feathers/issues/2625)) ([269fdec](https://github.com/feathersjs/feathers/commit/269fdecc5961092dc8608b3cbe16f433c80bfa96)) - -# [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) - -### Features - -- **mongodb:** Add feathers-mongodb adapter as @feathersjs/mongodb ([#2610](https://github.com/feathersjs/feathers/issues/2610)) ([6d43734](https://github.com/feathersjs/feathers/commit/6d43734a53db02c435cafc52a22dca414e5d0940)) diff --git a/packages/mongodb/LICENSE b/packages/mongodb/LICENSE deleted file mode 100644 index 7712f870f3..0000000000 --- a/packages/mongodb/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2024 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 -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -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 deleted file mode 100644 index 4cfca9afeb..0000000000 --- a/packages/mongodb/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# @feathersjs/mongodb - -[![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/mongodb.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/mongodb) -[![Discord](https://badgen.net/badge/icon/discord?icon=discord&label)](https://discord.gg/qa8kez8QBx) - -> Feathers MongoDB service adapter - -## Installation - -``` -npm install @feathersjs/mongodb --save -``` - -## Documentation - -Refer to the [Feathers MongoDB adapter documentation](https://feathersjs.com/api/databases/mongodb.html) 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/mongodb/package.json b/packages/mongodb/package.json deleted file mode 100644 index 5fa7b0a5a1..0000000000 --- a/packages/mongodb/package.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "name": "@feathersjs/mongodb", - "description": "Feathers MongoDB service adapter", - "version": "5.0.34", - "homepage": "https://feathersjs.com", - "main": "lib/", - "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": ">= 14" - }, - "files": [ - "CHANGELOG.md", - "LICENSE", - "README.md", - "src/**", - "lib/**", - "*.d.ts", - "*.js" - ], - "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" - }, - "directories": { - "lib": "lib" - }, - "publishConfig": { - "access": "public" - }, - "dependencies": { - "@feathersjs/adapter-commons": "^5.0.34", - "@feathersjs/commons": "^5.0.34", - "@feathersjs/errors": "^5.0.34", - "@feathersjs/feathers": "^5.0.34" - }, - "peerDependencies": { - "mongodb": "^6.18.0" - }, - "devDependencies": { - "@feathersjs/adapter-tests": "^5.0.34", - "@feathersjs/schema": "^5.0.34", - "@types/mocha": "^10.0.10", - "@types/node": "^24.1.0", - "mocha": "^11.7.1", - "mongodb-memory-server": "^10.1.4", - "shx": "^0.4.0", - "typescript": "^5.9.2" - }, - "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" -} diff --git a/packages/mongodb/src/adapter.ts b/packages/mongodb/src/adapter.ts deleted file mode 100644 index 2b4a2036a6..0000000000 --- a/packages/mongodb/src/adapter.ts +++ /dev/null @@ -1,588 +0,0 @@ -import { - ObjectId, - Collection, - FindOptions, - BulkWriteOptions, - InsertOneOptions, - DeleteOptions, - CountDocumentsOptions, - ReplaceOptions, - FindOneAndReplaceOptions, - FindOneAndUpdateOptions, - Document, - FindOneAndDeleteOptions -} from 'mongodb' -import { BadRequest, MethodNotAllowed, NotFound } from '@feathersjs/errors' -import { _ } from '@feathersjs/commons' -import { - AdapterBase, - AdapterParams, - AdapterServiceOptions, - PaginationOptions, - AdapterQuery, - getLimit -} from '@feathersjs/adapter-commons' -import { Id, Paginated } from '@feathersjs/feathers' -import { errorHandler } from './error-handler' - -export interface MongoDBAdapterOptions extends AdapterServiceOptions { - Model: Collection | Promise - disableObjectify?: boolean - useEstimatedDocumentCount?: boolean -} - -export interface MongoDBAdapterParams - extends AdapterParams> { - pipeline?: Document[] - mongodb?: - | BulkWriteOptions - | FindOptions - | InsertOneOptions - | DeleteOptions - | CountDocumentsOptions - | ReplaceOptions - | FindOneAndReplaceOptions - | FindOneAndDeleteOptions -} - -export type AdapterId = Id | ObjectId - -export type NullableAdapterId = AdapterId | null - -// Create the service. -export class MongoDbAdapter< - Result, - Data = Partial, - ServiceParams extends MongoDBAdapterParams = MongoDBAdapterParams, - PatchData = Partial -> extends AdapterBase { - constructor(options: MongoDBAdapterOptions) { - if (!options) { - throw new Error('MongoDB options have to be provided') - } - - super({ - id: '_id', - ...options - }) - } - - getObjectId(id: AdapterId) { - if (this.options.disableObjectify) { - return id - } - - if (this.id === '_id' && ObjectId.isValid(id)) { - id = new ObjectId(id.toString()) - } - - return id - } - - filterQuery(id: NullableAdapterId, params: ServiceParams) { - const options = this.getOptions(params) - const { $select, $sort, $limit: _limit, $skip = 0, ...query } = (params.query || {}) as AdapterQuery - const $limit = getLimit(_limit, options.paginate) - if (id !== null) { - query.$and = (query.$and || []).concat({ - [this.id]: this.getObjectId(id) - }) - } - - if (query[this.id]) { - query[this.id] = this.getObjectId(query[this.id]) - } - - return { - filters: { $select, $sort, $limit, $skip }, - query - } - } - - getModel(params: ServiceParams = {} as ServiceParams) { - const { Model } = this.getOptions(params) - return Promise.resolve(Model) - } - - async findRaw(params: ServiceParams) { - const { filters, query } = this.filterQuery(null, params) - const model = await this.getModel(params) - const q = model.find(query, params.mongodb) - - if (filters.$sort !== undefined) { - q.sort(filters.$sort) - } - - if (filters.$select !== undefined) { - q.project(this.getProjection(filters.$select)) - } - - if (filters.$skip !== undefined) { - q.skip(filters.$skip) - } - - if (filters.$limit !== undefined) { - q.limit(filters.$limit) - } - - return q - } - - /* TODO: Remove $out and $merge stages, else it returns an empty cursor. I think its safe to assume this is primarily for querying. */ - async aggregateRaw(params: ServiceParams) { - const model = await this.getModel(params) - const pipeline = params.pipeline || [] - const index = pipeline.findIndex((stage: Document) => stage.$feathers) - const before = index >= 0 ? pipeline.slice(0, index) : [] - const feathersPipeline = this.makeFeathersPipeline(params) - const after = index >= 0 ? pipeline.slice(index + 1) : pipeline - - return model.aggregate([...before, ...feathersPipeline, ...after], params.mongodb) - } - - makeFeathersPipeline(params: ServiceParams) { - const { filters, query } = this.filterQuery(null, params) - const pipeline: Document[] = [{ $match: query }] - - if (filters.$sort !== undefined) { - pipeline.push({ $sort: filters.$sort }) - } - - if (filters.$skip !== undefined) { - pipeline.push({ $skip: filters.$skip }) - } - - if (filters.$limit !== undefined) { - pipeline.push({ $limit: filters.$limit }) - } - - if (filters.$select !== undefined) { - pipeline.push({ $project: this.getProjection(filters.$select) }) - } - - return pipeline - } - - getProjection(select?: string[] | { [key: string]: number }) { - if (!select) { - return undefined - } - - if (Array.isArray(select)) { - if (!select.includes(this.id)) { - select = [this.id, ...select] - } - return select.reduce<{ [key: string]: number }>( - (value, name) => ({ - ...value, - [name]: 1 - }), - {} - ) - } - - if (!select[this.id]) { - return { - ...select, - [this.id]: 1 - } - } - - return select - } - - normalizeId(id: NullableAdapterId, data: D): D { - if (this.id === '_id') { - // Default Mongo IDs cannot be updated. The Mongo library handles - // this automatically. - return _.omit(data, this.id) - } else if (id !== null) { - // If not using the default Mongo _id field set the ID to its - // previous value. This prevents orphaned documents. - return { - ...data, - [this.id]: id - } - } - return data - } - - async countDocuments(params: ServiceParams) { - const { useEstimatedDocumentCount } = this.getOptions(params) - const { query } = this.filterQuery(null, params) - - if (params.pipeline) { - const aggregateParams = { - ...params, - paginate: false, - pipeline: [...params.pipeline, { $count: 'total' }], - query: { - ...params.query, - $select: [this.id], - $sort: undefined, - $skip: undefined, - $limit: undefined - } - } - const [result] = await this.aggregateRaw(aggregateParams).then((result) => result.toArray()) - if (!result) { - return 0 - } - return result.total - } - - const model = await this.getModel(params) - - if (useEstimatedDocumentCount && typeof model.estimatedDocumentCount === 'function') { - return model.estimatedDocumentCount() - } - - return model.countDocuments(query, params.mongodb) - } - - async _get(id: AdapterId, params: ServiceParams = {} as ServiceParams): Promise { - const { - query, - filters: { $select } - } = this.filterQuery(id, params) - - if (params.pipeline) { - const aggregateParams = { - ...params, - query: { - ...params.query, - $limit: 1, - $and: (params.query.$and || []).concat({ - [this.id]: this.getObjectId(id) - }) - } - } - - return this.aggregateRaw(aggregateParams) - .then((result) => result.toArray()) - .then(([result]) => { - if (!result) { - throw new NotFound(`No record found for id '${id}'`) - } - - return result - }) - .catch(errorHandler) - } - - const findOptions: FindOptions = { - projection: this.getProjection($select), - ...params.mongodb - } - - return this.getModel(params) - .then((model) => model.findOne(query, findOptions)) - .then((result) => { - if (!result) { - throw new NotFound(`No record found for id '${id}'`) - } - - return result - }) - .catch(errorHandler) - } - - async _find(params?: ServiceParams & { paginate?: PaginationOptions }): Promise> - async _find(params?: ServiceParams & { paginate: false }): Promise - async _find(params?: ServiceParams): Promise | Result[]> - async _find(params: ServiceParams = {} as ServiceParams): Promise | Result[]> { - const { paginate } = this.getOptions(params) - const { filters } = this.filterQuery(null, params) - const paginationDisabled = params.paginate === false || !paginate || !paginate.default - - const getData = () => { - const result = params.pipeline ? this.aggregateRaw(params) : this.findRaw(params) - return result.then((result) => result.toArray()) - } - - if (paginationDisabled) { - if (filters.$limit === 0) { - return [] as Result[] - } - const data = await getData() - return data as Result[] - } - - if (filters.$limit === 0) { - return { - total: await this.countDocuments(params), - data: [] as Result[], - limit: filters.$limit, - skip: filters.$skip || 0 - } - } - - const [data, total] = await Promise.all([getData(), this.countDocuments(params)]) - - return { - total, - data: data as Result[], - limit: filters.$limit, - skip: filters.$skip || 0 - } - } - - async _create(data: Data, params?: ServiceParams): Promise - async _create(data: Data[], params?: ServiceParams): Promise - async _create(data: Data | Data[], _params?: ServiceParams): Promise - async _create( - data: Data | Data[], - params: ServiceParams = {} as ServiceParams - ): Promise { - if (Array.isArray(data) && !this.allowsMulti('create', params)) { - throw new MethodNotAllowed('Can not create multiple entries') - } - - const model = await this.getModel(params) - const setId = (item: any) => { - const entry = Object.assign({}, item) - - if (this.id !== '_id' && typeof entry[this.id] === 'undefined') { - return { - [this.id]: new ObjectId().toHexString(), - ...entry - } - } - - return entry - } - - if (Array.isArray(data)) { - const created = await model.insertMany(data.map(setId), params.mongodb).catch(errorHandler) - return this._find({ - ...params, - paginate: false, - query: { - _id: { $in: Object.values(created.insertedIds) }, - $select: params.query?.$select - } - }) - } - - const created = await model.insertOne(setId(data), params.mongodb).catch(errorHandler) - const result = await this._find({ - ...params, - paginate: false, - query: { - _id: created.insertedId, - $select: params.query?.$select, - $limit: 1 - } - }) - return result[0] - } - - async _patch(id: null, data: PatchData | Partial, params?: ServiceParams): Promise - async _patch(id: AdapterId, data: PatchData | Partial, params?: ServiceParams): Promise - async _patch( - id: NullableAdapterId, - data: PatchData | Partial, - _params?: ServiceParams - ): Promise - async _patch( - id: NullableAdapterId, - _data: PatchData | Partial, - params: ServiceParams = {} as ServiceParams - ): Promise { - if (id === null && !this.allowsMulti('patch', params)) { - throw new MethodNotAllowed('Can not patch multiple entries') - } - - const data = this.normalizeId(id, _data) - const model = await this.getModel(params) - const { - query, - filters: { $sort, $select } - } = this.filterQuery(id, params) - - const replacement = Object.keys(data).reduce( - (current, key) => { - const value = (data as any)[key] - - if (key.charAt(0) !== '$') { - current.$set[key] = value - } else if (key === '$set') { - current.$set = { - ...current.$set, - ...value - } - } else { - current[key] = value - } - - return current - }, - { $set: {} } as any - ) - - if (id === null) { - const findParams = { - ...params, - paginate: false, - query: { - ...params.query, - $select: [this.id] - } - } - - return this._find(findParams) - .then(async (result) => { - const idList = (result as Result[]).map((item: any) => item[this.id]) - await model.updateMany({ [this.id]: { $in: idList } }, replacement, params.mongodb) - return this._find({ - ...params, - paginate: false, - query: { - [this.id]: { $in: idList }, - $sort, - $select - } - }) - }) - .catch(errorHandler) - } - - if (params.pipeline) { - const getParams = { - ...params, - query: { - ...params.query, - $select: [this.id] - } - } - - return this._get(id, getParams) - .then(async () => { - await model.updateOne({ [this.id]: id }, replacement, params.mongodb) - return this._get(id, { - ...params, - query: { $select } - }) - }) - .catch(errorHandler) - } - - const updateOptions: FindOneAndUpdateOptions = { - projection: this.getProjection($select), - ...(params.mongodb as FindOneAndUpdateOptions), - returnDocument: 'after' - } - - return model - .findOneAndUpdate(query, replacement, updateOptions) - .then((result) => { - if (!result) { - throw new NotFound(`No record found for id '${id}'`) - } - return result as Result - }) - .catch(errorHandler) - } - - async _update(id: AdapterId, data: Data, params: ServiceParams = {} as ServiceParams): Promise { - if (id === null || Array.isArray(data)) { - throw new BadRequest("You can not replace multiple instances. Did you mean 'patch'?") - } - - const { - query, - filters: { $select } - } = this.filterQuery(id, params) - const model = await this.getModel(params) - const replacement = this.normalizeId(id, data) - - if (params.pipeline) { - const getParams = { - ...params, - query: { - ...params.query, - $select: [this.id] - } - } - - return this._get(id, getParams) - .then(async () => { - await model.replaceOne({ [this.id]: id }, replacement, params.mongodb) - return this._get(id, { - ...params, - query: { $select } - }) - }) - .catch(errorHandler) - } - - const replaceOptions: FindOneAndReplaceOptions = { - projection: this.getProjection($select), - ...(params.mongodb as FindOneAndReplaceOptions), - returnDocument: 'after' - } - - return model - .findOneAndReplace(query, replacement, replaceOptions) - .then((result) => { - if (!result) { - throw new NotFound(`No record found for id '${id}'`) - } - return result as Result - }) - .catch(errorHandler) - } - - async _remove(id: null, params?: ServiceParams): Promise - async _remove(id: AdapterId, params?: ServiceParams): Promise - async _remove(id: NullableAdapterId, _params?: ServiceParams): Promise - async _remove( - id: NullableAdapterId | ObjectId, - params: ServiceParams = {} as ServiceParams - ): Promise { - if (id === null && !this.allowsMulti('remove', params)) { - throw new MethodNotAllowed('Can not remove multiple entries') - } - - const model = await this.getModel(params) - const { query } = this.filterQuery(id, params) - const findParams = { - ...params, - paginate: false - } - - if (id === null) { - return this._find(findParams) - .then(async (result) => { - const idList = (result as Result[]).map((item: any) => item[this.id]) - await model.deleteMany({ [this.id]: { $in: idList } }, params.mongodb) - return result - }) - .catch(errorHandler) - } - - if (params.pipeline) { - return this._get(id, params) - .then(async (result) => { - await model.deleteOne({ [this.id]: id }, params.mongodb) - return result - }) - .catch(errorHandler) - } - - const deleteOptions: FindOneAndDeleteOptions = { - ...(params.mongodb as FindOneAndDeleteOptions), - projection: this.getProjection(params.query?.$select) - } - - return model - .findOneAndDelete(query, deleteOptions) - .then((result) => { - if (!result) { - throw new NotFound(`No record found for id '${id}'`) - } - return result as Result - }) - .catch(errorHandler) - } -} diff --git a/packages/mongodb/src/converters.ts b/packages/mongodb/src/converters.ts deleted file mode 100644 index d4e8c47727..0000000000 --- a/packages/mongodb/src/converters.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { ObjectId } from 'mongodb' - -export type ObjectIdParam = string | number | ObjectId - -export type IdQueryObject = { - $in?: T[] - $nin?: T[] - $ne?: T -} - -const toObjectId = (value: ObjectIdParam) => new ObjectId(value) - -export async function resolveObjectId(value: ObjectIdParam) { - return toObjectId(value) -} - -export async function resolveQueryObjectId( - value: IdQueryObject -): Promise> -export async function resolveQueryObjectId(value: ObjectIdParam): Promise -export async function resolveQueryObjectId(value: ObjectIdParam | IdQueryObject) { - if (!value) { - return undefined - } - - if (typeof value === 'string' || typeof value === 'number' || value instanceof ObjectId) { - return toObjectId(value) - } - - const convertedObject: IdQueryObject = {} - - if (Array.isArray(value.$in)) { - convertedObject.$in = value.$in.map(toObjectId) - } - - if (Array.isArray(value.$nin)) { - convertedObject.$nin = value.$nin.map(toObjectId) - } - - if (value.$ne !== undefined) { - convertedObject.$ne = toObjectId(value.$ne) - } - - return convertedObject -} - -export const keywordObjectId = { - keyword: 'objectid', - type: 'string', - modifying: true, - compile(schemaVal: boolean) { - if (!schemaVal) return () => true - - return function (value: string, obj: any) { - const { parentData, parentDataProperty } = obj - try { - parentData[parentDataProperty] = new ObjectId(value) - return true - } catch (error) { - throw new Error(`invalid objectid for property "${parentDataProperty}"`) - } - } - } -} as const diff --git a/packages/mongodb/src/error-handler.ts b/packages/mongodb/src/error-handler.ts deleted file mode 100644 index e485b00f75..0000000000 --- a/packages/mongodb/src/error-handler.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { GeneralError } from '@feathersjs/errors' -import { MongoError } from 'mongodb' - -export function errorHandler(error: MongoError): any { - // See https://github.com/mongodb/mongo/blob/master/docs/errors.md - if (error && error.name && error.name.startsWith('Mongo')) { - throw new GeneralError(error, { - name: error.name, - code: error.code - }) - } - - throw error -} diff --git a/packages/mongodb/src/index.ts b/packages/mongodb/src/index.ts deleted file mode 100644 index 04e8d31676..0000000000 --- a/packages/mongodb/src/index.ts +++ /dev/null @@ -1,75 +0,0 @@ -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' - -export * from './adapter' -export * from './error-handler' -export * from './converters' - -export class MongoDBService< - Result = any, - Data = Partial, - ServiceParams extends Params = MongoDBAdapterParams, - PatchData = Partial -> extends MongoDbAdapter { - async find(params?: ServiceParams & { paginate?: PaginationOptions }): Promise> - async find(params?: ServiceParams & { paginate: false }): Promise - async find(params?: ServiceParams): Promise | Result[]> - async find(params?: ServiceParams): Promise | Result[]> { - return this._find({ - ...params, - query: await this.sanitizeQuery(params) - }) - } - - async get(id: AdapterId, params?: ServiceParams): Promise { - return this._get(id, { - ...params, - query: await this.sanitizeQuery(params) - }) - } - - async create(data: Data, params?: ServiceParams): Promise - async create(data: Data[], params?: ServiceParams): Promise - async create(data: Data | Data[], params?: ServiceParams): Promise - async create(data: Data | Data[], params?: ServiceParams): Promise { - if (Array.isArray(data) && !this.allowsMulti('create', params)) { - throw new MethodNotAllowed('Can not create multiple entries') - } - - return this._create(data, params) - } - - async update(id: NullableAdapterId, data: Data, params?: ServiceParams): Promise - async update(id: AdapterId, data: Data, params?: ServiceParams): Promise { - return this._update(id, data, { - ...params, - query: await this.sanitizeQuery(params) - }) - } - - async patch(id: null, data: PatchData, params?: ServiceParams): Promise - async patch(id: AdapterId, data: PatchData, params?: ServiceParams): Promise - async patch(id: NullableAdapterId, data: PatchData, params?: ServiceParams): Promise - async patch(id: NullableAdapterId, data: PatchData, params?: ServiceParams): Promise { - const { $limit, ...query } = await this.sanitizeQuery(params) - - return this._patch(id, data, { - ...params, - query - }) - } - - async remove(id: AdapterId, params?: ServiceParams): Promise - async remove(id: null, params?: ServiceParams): Promise - async remove(id: NullableAdapterId, params?: ServiceParams): Promise - async remove(id: NullableAdapterId, params?: ServiceParams): Promise { - const { $limit, ...query } = await this.sanitizeQuery(params) - - return this._remove(id, { - ...params, - query - }) - } -} diff --git a/packages/mongodb/test/converters.test.ts b/packages/mongodb/test/converters.test.ts deleted file mode 100644 index f8d965e8c4..0000000000 --- a/packages/mongodb/test/converters.test.ts +++ /dev/null @@ -1,109 +0,0 @@ -import { Ajv } from '@feathersjs/schema' -import assert from 'assert' -import { ObjectId } from 'mongodb' -import { keywordObjectId, resolveObjectId, resolveQueryObjectId } from '../src' - -describe('ObjectId resolvers', () => { - it('resolveObjectId', async () => { - const oid = await resolveObjectId('5f9e3c1b9b9b9b9b9b9b9b9b') - - assert.ok(oid instanceof ObjectId) - }) - - it('resolveQueryObjectId', async () => { - const oid = await resolveQueryObjectId('5f9e3c1b9b9b9b9b9b9b9b9b') - - assert.ok(oid instanceof ObjectId) - }) - - it('resolveQueryObjectId with object', async () => { - const oids = await resolveQueryObjectId({ - $in: ['5f9e3c1b9b9b9b9b9b9b9b9b'], - $ne: '5f9e3c1b9b9b9b9b9b9b9b9a' - }) - - assert.ok(oids.$in && oids.$in[0] instanceof ObjectId) - assert.ok(oids.$ne instanceof ObjectId) - }) - - it('resolveQueryObjectId with falsey value', async () => { - await resolveQueryObjectId(undefined) - await resolveQueryObjectId(null) - await resolveQueryObjectId(0) - - assert.ok('Falsey value does not throw exception') - }) -}) - -const validator = new Ajv({ coerceTypes: true }) -validator.addKeyword(keywordObjectId) - -describe('objectid keyword', () => { - it('converts objectid strings when keyword is used', async () => { - const schema = { - type: 'object', - properties: { - _id: { type: 'string', objectid: true }, - otherId: { type: 'string', objectid: true } - }, - additionalProperties: false - } - const validate = validator.compile(schema) - - const data = { - _id: '622585621f3996763f1e4444', - otherId: '622585621f3996763f1e5555' - } - assert.equal(typeof data._id, 'string') - assert.equal(typeof data.otherId, 'string') - - // runs converters - validate(data) - - assert.ok((data._id as any) instanceof ObjectId) - assert.equal(typeof data.otherId, 'object') - }) - - it('does not convert objectid strings without keyword', async () => { - const schema = { - type: 'object', - properties: { - _id: { type: 'string' }, - otherId: { type: 'string' } - }, - additionalProperties: false - } - const validate = validator.compile(schema) - - const data = { - _id: '622585621f3996763f1e4444', - otherId: '622585621f3996763f1e5555' - } - assert.equal(typeof data._id, 'string') - assert.equal(typeof data.otherId, 'string') - - // runs converters - validate(data) - - assert.equal(typeof data._id, 'string') - assert.equal(typeof data.otherId, 'string') - }) - - it('fails on invalid objectids', async () => { - const schema = { - type: 'object', - properties: { - _id: { type: 'string', objectid: true } - }, - additionalProperties: false - } - const validate = validator.compile(schema) - - const data = { - _id: '622585621f3996763f1e444' - } - assert.equal(typeof data._id, 'string') - - assert.throws(() => validate(data), /invalid objectid for property "_id"/) - }) -}) diff --git a/packages/mongodb/test/index.test.ts b/packages/mongodb/test/index.test.ts deleted file mode 100644 index 5d3d2f6fc5..0000000000 --- a/packages/mongodb/test/index.test.ts +++ /dev/null @@ -1,844 +0,0 @@ -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 { feathers } from '@feathersjs/feathers' -import errors from '@feathersjs/errors' -import { MongoDBService, AdapterId } from '../src' - -const testSuite = adapterTests([ - '.options', - '.events', - '._get', - '._find', - '._create', - '._update', - '._patch', - '._remove', - '.get', - '.get + $select', - '.get + id + query', - '.get + NotFound', - '.get + id + query id', - '.find', - '.find + paginate + query', - '.remove', - '.remove + $select', - '.remove + id + query', - '.remove + multi', - '.remove + multi no pagination', - '.remove + id + query id', - '.remove + NotFound', - '.update', - '.update + $select', - '.update + id + query', - '.update + NotFound', - '.update + id + query id', - '.update + query + NotFound', - '.patch', - '.patch + $select', - '.patch + id + query', - '.patch multiple', - '.patch multiple no pagination', - '.patch multi query same', - '.patch multi query changed', - '.patch + query + NotFound', - '.patch + NotFound', - '.patch + id + query id', - '.create', - '.create ignores query', - '.create + $select', - '.create multi', - 'internal .find', - 'internal .get', - 'internal .create', - 'internal .update', - 'internal .patch', - 'internal .remove', - '.find + equal', - '.find + equal multiple', - '.find + $sort', - '.find + $sort + string', - '.find + $limit', - '.find + $limit 0', - '.find + $skip', - '.find + $select', - '.find + $or', - '.find + $and', - '.find + $in', - '.find + $nin', - '.find + $lt', - '.find + $lte', - '.find + $gt', - '.find + $gte', - '.find + $ne', - '.find + $gt + $lt + $sort', - '.find + $or nested + $sort', - '.find + $and + $or', - '.find + paginate', - '.find + paginate + $limit + $skip', - '.find + paginate + $limit 0', - '.find + paginate + params', - 'params.adapter + paginate', - 'params.adapter + multi' -]) - -describe('Feathers MongoDB Service', () => { - const personSchema = { - $id: 'Person', - type: 'object', - additionalProperties: false, - required: ['_id', 'name', 'age'], - properties: { - _id: { oneOf: [{ type: 'string' }, { type: 'object' }] }, - name: { type: 'string' }, - age: { type: 'number' }, - friends: { type: 'array', items: { type: 'string' } }, - team: { type: 'string' }, - $push: { - type: 'object', - properties: { - friends: { type: 'string' } - } - } - } - } as const - const personQuery = { - $id: 'PersonQuery', - type: 'object', - additionalProperties: false, - properties: { - ...querySyntax(personSchema.properties, { - name: { - $regex: { type: 'string' } - } - }) - } - } as const - const validator = new Ajv({ - coerceTypes: true - }) - const personQueryValidator = getValidator(personQuery, validator) - - type Person = Omit, '_id'> & { _id: AdapterId } - type Todo = { - _id: string - name: string - userId: string - person?: Person - } - - type ServiceTypes = { - people: MongoDBService - 'people-customid': MongoDBService - todos: MongoDBService - } - - const app = feathers() - - let db: Db - let mongoClient: MongoClient - let mongod: MongoMemoryServer - - before(async () => { - mongod = await MongoMemoryServer.create() - - const client = await MongoClient.connect(mongod.getUri()) - - mongoClient = client - db = client.db('feathers-test') - - app.use( - 'people', - new MongoDBService({ - Model: db.collection('people'), - events: ['testing'] - }) - ) - app.use( - 'people-customid', - new MongoDBService({ - Model: db.collection('people-customid'), - id: 'customid', - events: ['testing'] - }) - ) - - app.service('people').hooks({ - before: { - find: [hooks.validateQuery(personQueryValidator)] - } - }) - - db.collection('people-customid').deleteMany({}) - db.collection('people').deleteMany({}) - db.collection('todos').deleteMany({}) - - db.collection('people').createIndex({ name: 1 }, { partialFilterExpression: { team: 'blue' } }) - }) - - after(async () => { - await db.dropDatabase() - await mongoClient.close() - await mongod.stop() - }) - - describe('Service utility functions', () => { - describe('getObjectId', () => { - it('returns an ObjectID instance for a valid ID', () => { - const id = new ObjectId() - const objectify = app.service('people').getObjectId(id.toString()) - - assert.ok(objectify instanceof ObjectId) - assert.strictEqual(objectify.toString(), id.toString()) - }) - - it('returns an ObjectID instance for a valid ID', () => { - const id = 'non-valid object id' - const objectify = app.service('people').getObjectId(id.toString()) - - assert.ok(!(objectify instanceof ObjectId)) - assert.strictEqual(objectify, id) - }) - }) - }) - - // For some bizarre reason this test is flaky - describe.skip('works with ObjectIds', () => { - it('can call methods with ObjectId instance', async () => { - const person = await app.service('people').create({ - name: 'David' - }) - - const withId = await app.service('people').get(person._id.toString()) - - assert.strictEqual(withId.name, 'David') - - await app.service('people').remove(new ObjectId(person._id.toString())) - }) - }) - - describe('Special collation param', () => { - let peopleService: MongoDBService - let people: Person[] - - function indexOfName(results: Person[], name: string) { - let index = 0 - - for (const person of results) { - if (person.name === name) { - return index - } - index++ - } - - return -1 - } - - beforeEach(async () => { - peopleService = app.service('people') - peopleService.options.multi = true - peopleService.options.disableObjectify = true - people = await peopleService.create([{ name: 'AAA' }, { name: 'aaa' }, { name: 'ccc' }]) - }) - - afterEach(async () => { - peopleService.options.multi = false - - try { - await Promise.all([ - peopleService.remove(people[0]._id), - peopleService.remove(people[1]._id), - peopleService.remove(people[2]._id) - ]) - } catch (error: unknown) {} - }) - - it('queries for ObjectId in find', async () => { - const person = await peopleService.create({ name: 'Coerce' }) - const results = await peopleService.find({ - paginate: false, - query: { - _id: new ObjectId(person._id) - } - }) - - assert.strictEqual(results.length, 1) - - await peopleService.remove(person._id) - }) - - it('works with normal string _id', async () => { - const person = await peopleService.create({ - _id: 'lessonKTDA08', - name: 'Coerce' - }) - const result = await peopleService.get(person._id) - - assert.strictEqual(result.name, 'Coerce') - - await peopleService.remove(person._id) - }) - - it('sorts with default behavior without collation param', async () => { - const results = await peopleService.find({ - paginate: false, - query: { $sort: { name: -1 } } - }) - - assert.ok(indexOfName(results, 'aaa') < indexOfName(results, 'AAA')) - }) - - it('sorts using collation param if present', async () => { - const results = await peopleService.find({ - paginate: false, - query: { $sort: { name: -1 } }, - mongodb: { collation: { locale: 'en', strength: 1 } } - }) - - assert.ok(indexOfName(results, 'aaa') > indexOfName(results, 'AAA')) - }) - - it('removes with default behavior without collation param', async () => { - await peopleService.remove(null, { query: { name: { $gt: 'AAA' } } }) - - const results = await peopleService.find({ paginate: false }) - - assert.strictEqual(results.length, 1) - assert.strictEqual(results[0].name, 'AAA') - }) - - it('removes using collation param if present', async () => { - const removed = await peopleService.remove(null, { - query: { name: 'AAA' }, - mongodb: { collation: { locale: 'en', strength: 1 } } - }) - const results = await peopleService.find({ paginate: false }) - - assert.strictEqual(removed.length, 2) - assert.strictEqual(results[0].name, 'ccc') - assert.strictEqual(results.length, 1) - }) - - it('handles errors', async () => { - await assert.rejects( - () => - peopleService.create( - { - name: 'Dave' - }, - { - mongodb: { collation: { locale: 'fdsfdsfds', strength: 1 } } - } - ), - { - name: 'GeneralError' - } - ) - }) - - it('updates with default behavior without collation param', async () => { - const query = { name: { $gt: 'AAA' } } - - const result = await peopleService.patch(null, { age: 99 }, { query }) - - assert.strictEqual(result.length, 2) - result.forEach((person) => { - assert.strictEqual(person.age, 99) - }) - }) - - it('updates using collation param if present', async () => { - const result = await peopleService.patch( - null, - { age: 110 }, - { - query: { name: { $gt: 'AAA' } }, - mongodb: { collation: { locale: 'en', strength: 1 } } - } - ) - - assert.strictEqual(result.length, 1) - assert.strictEqual(result[0].name, 'ccc') - }) - - it('pushes to an array using patch', async () => { - const result = await peopleService.patch( - null, - { $push: { friends: 'Adam' } }, - { - query: { name: { $gt: 'AAA' } } - } - ) - - assert.strictEqual(result[0].friends?.length, 1) - - const patched = await peopleService.patch( - null, - { - $push: { friends: 'Bell' } - }, - { query: { name: { $gt: 'AAA' } } } - ) - - assert.strictEqual(patched[0].friends?.length, 2) - }) - - it('can use $limit in patch', async () => { - const data = { name: 'ddd' } - const query = { $limit: 1 } - - const result = await peopleService._patch(null, data, { - query - }) - - assert.strictEqual(result.length, 1) - assert.strictEqual(result[0].name, 'ddd') - - const pipelineResult = await peopleService._patch(null, data, { - pipeline: [], - query - }) - - assert.strictEqual(pipelineResult.length, 1) - assert.strictEqual(pipelineResult[0].name, 'ddd') - }) - - it('can use $limit in remove', async () => { - const query = { $limit: 1 } - - const result = await peopleService._remove(null, { - query - }) - - assert.strictEqual(result.length, 1) - - const pipelineResult = await peopleService._remove(null, { - pipeline: [], - query - }) - - assert.strictEqual(pipelineResult.length, 1) - }) - - it('can use $sort in patch', async () => { - const updated = await peopleService._patch( - null, - { name: 'ddd' }, - { - query: { $limit: 1, $sort: { name: -1 } } - } - ) - - const result = await peopleService.find({ - paginate: false, - query: { $limit: 1, $sort: { name: -1 } } - }) - - assert.strictEqual(updated.length, 1) - assert.strictEqual(result[0].name, 'ddd') - - const pipelineUpdated = await peopleService._patch( - null, - { name: 'eee' }, - { - pipeline: [], - query: { $limit: 1, $sort: { name: -1 } } - } - ) - - const pipelineResult = await peopleService.find({ - paginate: false, - pipeline: [], - query: { $limit: 1, $sort: { name: -1 } } - }) - - assert.strictEqual(pipelineUpdated.length, 1) - assert.strictEqual(pipelineResult[0].name, 'eee') - }) - - it('can use $sort in remove', async () => { - const removed = await peopleService._remove(null, { - query: { $limit: 1, $sort: { name: -1 } } - }) - - assert.strictEqual(removed.length, 1) - assert.strictEqual(removed[0].name, 'ccc') - - const pipelineRemoved = await peopleService._remove(null, { - pipeline: [], - query: { $limit: 1, $sort: { name: -1 } } - }) - - assert.strictEqual(pipelineRemoved.length, 1) - assert.strictEqual(pipelineRemoved[0].name, 'aaa') - }) - - it('overrides default index selection using hint param if present', async () => { - const indexed = await peopleService.create({ - name: 'Indexed', - team: 'blue' - }) - - const result = await peopleService.find({ - paginate: false, - query: {}, - mongodb: { hint: { name: 1 } } - }) - - assert.strictEqual(result[0].name, 'Indexed') - assert.strictEqual(result.length, 1) - - await peopleService.remove(indexed._id) - }) - }) - - describe('Aggregation', () => { - let bob: any - let alice: any - let doug: any - - before(async () => { - app.use( - 'todos', - new MongoDBService({ - Model: db.collection('todos'), - events: ['testing'] - }) - ) - bob = await app.service('people').create({ name: 'Bob', age: 25 }) - alice = await app.service('people').create({ name: 'Alice', age: 19 }) - doug = await app.service('people').create({ name: 'Doug', age: 32 }) - - // Create a task for each person - await app.service('todos').create({ name: 'Bob do dishes', userId: bob._id }) - await app.service('todos').create({ name: 'Bob do laundry', userId: bob._id }) - await app.service('todos').create({ name: 'Alice do dishes', userId: alice._id }) - await app.service('todos').create({ name: 'Doug do dishes', userId: doug._id }) - }) - - after(async () => { - db.collection('people').deleteMany({}) - db.collection('todos').deleteMany({}) - }) - - it('assumes the feathers stage runs before all if it is not explicitly provided in pipeline', async () => { - const result = await app.service('todos').find({ - query: { name: /dishes/, $sort: { name: 1 } }, - pipeline: [ - { - $lookup: { - from: 'people', - localField: 'userId', - foreignField: '_id', - as: 'person' - } - }, - { $unwind: { path: '$person' } } - ], - paginate: false - }) - assert.deepEqual(result[0].person, alice) - assert.deepEqual(result[1].person, bob) - assert.deepEqual(result[2].person, doug) - }) - - it('can prepend stages by explicitly placing the feathers stage', async () => { - const result = await app.service('todos').find({ - query: { $sort: { name: 1 } }, - pipeline: [ - { $match: { name: 'Bob do dishes' } }, - { $feathers: {} }, - { - $lookup: { - from: 'people', - localField: 'userId', - foreignField: '_id', - as: 'person' - } - }, - { $unwind: { path: '$person' } } - ], - paginate: false - }) - assert.deepEqual(result[0].person, bob) - assert.equal(result.length, 1) - }) - - it('can count documents with aggregation', async () => { - const service = app.service('people') - const paginateBefore = service.options.paginate - - const test = async (paginate: any) => { - service.options.paginate = paginate - const query = { age: { $gte: 25 } } - const findResult = await app.service('people').find({ query }) - const aggregationResult = await app.service('people').find({ query, pipeline: [] }) - assert.deepStrictEqual(findResult.total, aggregationResult.total) - } - - await test({ default: 10, max: 50 }) - // There are 2 people with age >= 25. - // Test that aggregation works when results are less than default - await test({ default: 1, max: 50 }) - - service.options.paginate = paginateBefore - }) - - it('can use aggregation in _get', async () => { - const dave = await app.service('people').create({ name: 'Dave', age: 25 }) - const result = await app.service('people').get(dave._id, { - pipeline: [{ $addFields: { aggregation: true } }] - }) - - assert.deepStrictEqual(result, { ...dave, aggregation: true }) - - app.service('people').remove(dave._id) - }) - - it('can use aggregation in _create', async () => { - const dave = (await app.service('people').create( - { name: 'Dave' }, - { - pipeline: [{ $addFields: { aggregation: true } }] - } - )) as any - - assert.deepStrictEqual(dave.aggregation, true) - - app.service('people').remove(dave._id) - }) - - it('can use aggregation in multi _create', async () => { - app.service('people').options.multi = true - const dave = (await app.service('people').create([{ name: 'Dave' }], { - pipeline: [{ $addFields: { aggregation: true } }] - })) as any - - assert.deepStrictEqual(dave[0].aggregation, true) - - app.service('people').options.multi = false - app.service('people').remove(dave[0]._id) - }) - - it('can use aggregation in _update', async () => { - const dave = await app.service('people').create({ name: 'Dave' }) - const result = await app.service('people').update( - dave._id, - { - name: 'Marshal' - }, - { - pipeline: [{ $addFields: { aggregation: true } }] - } - ) - - assert.deepStrictEqual(result, { ...dave, name: 'Marshal', aggregation: true }) - - app.service('people').remove(dave._id) - }) - - it('can use aggregation in _patch', async () => { - const dave = await app.service('people').create({ name: 'Dave' }) - const result = await app.service('people').patch( - dave._id, - { - name: 'Marshal' - }, - { - pipeline: [{ $addFields: { aggregation: true } }] - } - ) - - assert.deepStrictEqual(result, { ...dave, name: 'Marshal', aggregation: true }) - - app.service('people').remove(dave._id) - }) - - it('can use aggregation in multi _patch', async () => { - app.service('people').options.multi = true - const dave = await app.service('people').create({ name: 'Dave' }) - const result = await app.service('people').patch( - null, - { - name: 'Marshal' - }, - { - query: { _id: dave._id }, - pipeline: [{ $addFields: { aggregation: true } }] - } - ) - - assert.deepStrictEqual(result[0], { ...dave, name: 'Marshal', aggregation: true }) - - app.service('people').options.multi = false - app.service('people').remove(dave._id) - }) - - it('can use aggregation and query in _update', async () => { - const dave = await app.service('people').create({ name: 'Dave' }) - const result = await app.service('people').update( - dave._id, - { - name: 'Marshal' - }, - { - query: { name: 'Dave' }, - pipeline: [{ $addFields: { aggregation: true } }] - } - ) - - assert.deepStrictEqual(result, { ...dave, name: 'Marshal', aggregation: true }) - - app.service('people').remove(dave._id) - }) - - it('can use aggregation and query in _patch', async () => { - const dave = await app.service('people').create({ name: 'Dave' }) - const result = await app.service('people').patch( - dave._id, - { - name: 'Marshal' - }, - { - query: { name: 'Dave' }, - pipeline: [{ $addFields: { aggregation: true } }] - } - ) - - assert.deepStrictEqual(result, { ...dave, name: 'Marshal', aggregation: true }) - - app.service('people').remove(dave._id) - }) - - it('can use aggregation in _remove', async () => { - const dave = await app.service('people').create({ name: 'Dave' }) - const result = await app.service('people').remove(dave._id, { - pipeline: [{ $addFields: { aggregation: true } }] - }) - - assert.deepStrictEqual(result, { ...dave, aggregation: true }) - - try { - await await app.service('people').get(dave._id) - throw new Error('Should never get here') - } catch (error: any) { - assert.strictEqual(error.name, 'NotFound', 'Got a NotFound Feathers error') - } - }) - - it('can use aggregation in multi _remove', async () => { - app.service('people').options.multi = true - const dave = await app.service('people').create({ name: 'Dave' }) - const result = await app.service('people').remove(null, { - query: { _id: dave._id }, - pipeline: [{ $addFields: { aggregation: true } }] - }) - - assert.deepStrictEqual(result[0], { ...dave, aggregation: true }) - - app.service('people').options.multi = false - // app.service('people').remove(dave._id) - }) - }) - - describe('query validation', () => { - it('validated queries are not sanitized', async () => { - const dave = await app.service('people').create({ name: 'Dave' }) - const result = await app.service('people').find({ - query: { - name: { - $regex: 'Da.*' - } - } - }) - assert.deepStrictEqual(result, [dave]) - - app.service('people').remove(dave._id) - }) - }) - - // TODO: Should this test be part of the adapterTests? - describe('Updates mutated query', () => { - it('Can re-query mutated data', async () => { - const dave = await app.service('people').create({ name: 'Dave' }) - const dave2 = await app.service('people').create({ name: 'Dave' }) - app.service('people').options.multi = true - - const updated = await app - .service('people') - .update(dave._id, { name: 'Marshal' }, { query: { name: 'Dave' } }) - - assert.deepStrictEqual(updated, { - ...dave, - name: 'Marshal' - }) - - const patched = await app - .service('people') - .patch(dave._id, { name: 'Dave' }, { query: { name: 'Marshal' } }) - - assert.deepStrictEqual(patched, { - ...dave, - name: 'Dave' - }) - - const updatedPipeline = await app - .service('people') - .update(dave._id, { name: 'Marshal' }, { query: { name: 'Dave' }, pipeline: [] }) - - assert.deepStrictEqual(updatedPipeline, { - ...dave, - name: 'Marshal' - }) - - const patchedPipeline = await app - .service('people') - .patch(dave._id, { name: 'Dave' }, { query: { name: 'Marshal' }, pipeline: [] }) - - assert.deepStrictEqual(patchedPipeline, { - ...dave, - name: 'Dave' - }) - - const multiPatch = await app - .service('people') - .patch(null, { name: 'Marshal' }, { query: { name: 'Dave' } }) - - assert.deepStrictEqual(multiPatch, [ - { - ...dave, - name: 'Marshal' - }, - { - ...dave2, - name: 'Marshal' - } - ]) - - const multiPatchPipeline = await app - .service('people') - .patch(null, { name: 'Dave' }, { query: { name: 'Marshal' }, pipeline: [] }) - - assert.deepStrictEqual(multiPatchPipeline, [ - { - ...dave, - name: 'Dave' - }, - { - ...dave2, - name: 'Dave' - } - ]) - - app.service('people').options.multi = false - - app.service('people').remove(dave._id) - app.service('people').remove(dave2._id) - }) - }) - - testSuite(app, errors, 'people', '_id') - testSuite(app, errors, 'people-customid', 'customid') -}) diff --git a/packages/mongodb/tsconfig.json b/packages/mongodb/tsconfig.json deleted file mode 100644 index 316fd41336..0000000000 --- a/packages/mongodb/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig", - "include": [ - "src/**/*.ts" - ], - "compilerOptions": { - "outDir": "lib" - } -} diff --git a/packages/rest-client/CHANGELOG.md b/packages/rest-client/CHANGELOG.md deleted file mode 100644 index 26dabaa715..0000000000 --- a/packages/rest-client/CHANGELOG.md +++ /dev/null @@ -1,676 +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.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/rest-client - -## [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/rest-client - -## [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/rest-client - -## [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/rest-client - -## [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/rest-client - -## [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/rest-client - -## [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/rest-client - -## [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/rest-client - -## [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/rest-client - -## [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/rest-client - -## [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/rest-client - -## [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/rest-client - -## [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/rest-client - -## [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/rest-client - -## [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/rest-client - -## [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/rest-client - -## [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/rest-client - -## [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/rest-client - -## [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/rest-client - -## [5.0.11](https://github.com/feathersjs/feathers/compare/v5.0.10...v5.0.11) (2023-10-11) - -### Bug Fixes - -- **client:** Replace placeholders in URL with route params ([#3270](https://github.com/feathersjs/feathers/issues/3270)) ([a0624eb](https://github.com/feathersjs/feathers/commit/a0624eb5a7919aa1b179a71beb1c1b9cab574525)) -- **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/rest-client - -## [5.0.9](https://github.com/feathersjs/feathers/compare/v5.0.8...v5.0.9) (2023-09-27) - -### Bug Fixes - -- **client:** Add underscored methods to clients ([#3176](https://github.com/feathersjs/feathers/issues/3176)) ([f3c01f7](https://github.com/feathersjs/feathers/commit/f3c01f7b8266bfc642c55b77ba8e5bb333542630)) - -## [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/rest-client - -## [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/rest-client - -## [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/rest-client - -## [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/rest-client - -## [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/rest-client - -# [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/rest-client - -# [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/rest-client - -# [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/rest-client - -# [5.0.0-pre.36](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.35...v5.0.0-pre.36) (2023-01-29) - -### Bug Fixes - -- Update all dependencies ([#3024](https://github.com/feathersjs/feathers/issues/3024)) ([283dc47](https://github.com/feathersjs/feathers/commit/283dc4798d85584bc031e6e54b83b4ea77d1edd0)) - -# [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/rest-client - -# [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/rest-client - -# [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/rest-client - -# [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 @feathersjs/rest-client - -# [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/rest-client - -# [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/rest-client - -# [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/rest-client - -# [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/rest-client - -# [5.0.0-pre.24](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.23...v5.0.0-pre.24) (2022-06-21) - -### Features - -- **cli:** Add typed client to a generated app ([#2669](https://github.com/feathersjs/feathers/issues/2669)) ([5b801b5](https://github.com/feathersjs/feathers/commit/5b801b5017ddc3eaa95622b539f51d605916bc86)) - -# [5.0.0-pre.23](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.22...v5.0.0-pre.23) (2022-06-06) - -### Bug Fixes - -- **express:** Ensure Express options can be set before configuring REST transport ([#2655](https://github.com/feathersjs/feathers/issues/2655)) ([c9b8f74](https://github.com/feathersjs/feathers/commit/c9b8f74a0196acb99be44ac5e0fff3f1128288cd)) - -### Features - -- **client:** Improve client side custom method support ([#2654](https://github.com/feathersjs/feathers/issues/2654)) ([c138acf](https://github.com/feathersjs/feathers/commit/c138acf50affbe6b66177d084d3c7a3e9220f09f)) - -# [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/rest-client - -# [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/rest-client - -# [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) - -### Features - -- **typescript:** Improve adapter typings ([#2605](https://github.com/feathersjs/feathers/issues/2605)) ([3b2ca0a](https://github.com/feathersjs/feathers/commit/3b2ca0a6a8e03e8390272c4d7e930b4bffdaacf5)) -- **typescript:** Improve params and query typeability ([#2600](https://github.com/feathersjs/feathers/issues/2600)) ([df28b76](https://github.com/feathersjs/feathers/commit/df28b7619161f1df5e700326f52cca1a92dc5d28)) - -# [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/rest-client - -# [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/rest-client - -# [5.0.0-pre.16](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.15...v5.0.0-pre.16) (2022-01-12) - -### Features - -- **express, koa:** make transports similar ([#2486](https://github.com/feathersjs/feathers/issues/2486)) ([26aa937](https://github.com/feathersjs/feathers/commit/26aa937c114fb8596dfefc599b1f53cead69c159)) - -# [5.0.0-pre.15](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.14...v5.0.0-pre.15) (2021-11-27) - -### Bug Fixes - -- **typescript:** Overall typing improvements ([#2478](https://github.com/feathersjs/feathers/issues/2478)) ([b8eb804](https://github.com/feathersjs/feathers/commit/b8eb804158556d9651a8607e3c3fda15e0bfd110)) - -# [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/rest-client - -# [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/rest-client - -# [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/rest-client - -# [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/rest-client - -# [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/rest-client - -# [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/rest-client - -# [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/rest-client - -# [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/rest-client - -# [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/rest-client - -# [5.0.0-pre.5](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.4...v5.0.0-pre.5) (2021-06-23) - -### Features - -- **adapter-commons:** Add support for params.adapter option and move memory adapter to @feathersjs/memory ([#2367](https://github.com/feathersjs/feathers/issues/2367)) ([a43e7da](https://github.com/feathersjs/feathers/commit/a43e7da22b6b981a96d1321736ea9a0cb924fb4f)) - -# [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/rest-client - -# [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/rest-client - -# [5.0.0-beta.1](https://github.com/feathersjs/feathers/compare/v5.0.0-beta.0...v5.0.0-beta.1) (2021-04-03) - -### Bug Fixes - -- **dependencies:** Fix transport-commons dependency and update other dependencies ([#2284](https://github.com/feathersjs/feathers/issues/2284)) ([05b03b2](https://github.com/feathersjs/feathers/commit/05b03b27b40604d956047e3021d8053c3a137616)) - -# [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)) - -### Features - -- **core:** Public custom service methods ([#2270](https://github.com/feathersjs/feathers/issues/2270)) ([e65abfb](https://github.com/feathersjs/feathers/commit/e65abfb5388df6c19a11c565cf1076a29f32668d)) -- Feathers v5 core refactoring and features ([#2255](https://github.com/feathersjs/feathers/issues/2255)) ([2dafb7c](https://github.com/feathersjs/feathers/commit/2dafb7ce14ba57406aeec13d10ca45b1e709bee9)) - -# [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) - -**Note:** Version bump only for package @feathersjs/rest-client - -# [5.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v4.5.4...v5.0.0-pre.0) (2020-05-19) - -## [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/rest-client - -## [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/rest-client - -## [4.5.9](https://github.com/feathersjs/feathers/compare/v4.5.8...v4.5.9) (2020-10-09) - -### Bug Fixes - -- **rest-client:** Handle non-JSON errors with fetch adapter ([#2086](https://github.com/feathersjs/feathers/issues/2086)) ([e24217a](https://github.com/feathersjs/feathers/commit/e24217ad1e784ad71cd9d64fe1727dd02f039991)) - -## [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/rest-client - -## [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/rest-client - -## [4.5.6](https://github.com/feathersjs/feathers/compare/v4.5.5...v4.5.6) (2020-07-12) - -**Note:** Version bump only for package @feathersjs/rest-client - -## [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/rest-client - -## [4.5.4](https://github.com/feathersjs/feathers/compare/v4.5.3...v4.5.4) (2020-04-29) - -**Note:** Version bump only for package @feathersjs/rest-client - -## [4.5.3](https://github.com/feathersjs/feathers/compare/v4.5.2...v4.5.3) (2020-04-17) - -**Note:** Version bump only for package @feathersjs/rest-client - -## [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/rest-client - -## [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/rest-client - -# [4.5.0](https://github.com/feathersjs/feathers/compare/v4.4.3...v4.5.0) (2020-01-18) - -### Features - -- **rest-client:** Allow for customising rest clients ([#1780](https://github.com/feathersjs/feathers/issues/1780)) ([c5cfec7](https://github.com/feathersjs/feathers/commit/c5cfec7a4aafcaffaab0cdacb9b5d297ff20320f)) - -## [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/rest-client - -## [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/rest-client - -# [4.4.0](https://github.com/feathersjs/feathers/compare/v4.3.11...v4.4.0) (2019-11-27) - -### Bug Fixes - -- **core:** Improve hook missing parameter message by adding the service name ([#1703](https://github.com/feathersjs/feathers/issues/1703)) ([2331c2a](https://github.com/feathersjs/feathers/commit/2331c2a3dd70d432db7d62a76ed805d359cbbba5)) -- **rest-client:** Allow to customize getting the query ([#1594](https://github.com/feathersjs/feathers/issues/1594)) ([5f21272](https://github.com/feathersjs/feathers/commit/5f212729849414c4da6f0d51edd1986feca992ee)) - -## [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/rest-client - -## [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/rest-client - -## [4.3.9](https://github.com/feathersjs/feathers/compare/v4.3.8...v4.3.9) (2019-10-26) - -**Note:** Version bump only for package @feathersjs/rest-client - -## [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/rest-client - -## [4.3.5](https://github.com/feathersjs/feathers/compare/v4.3.4...v4.3.5) (2019-10-07) - -### Bug Fixes - -- Change this reference in client libraries to explicitly passed app ([#1597](https://github.com/feathersjs/feathers/issues/1597)) ([4e4d10a](https://github.com/feathersjs/feathers/commit/4e4d10a)) - -## [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/rest-client - -## [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/rest-client - -## [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/rest-client - -## [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/rest-client - -# [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/rest-client - -# [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/rest-client - -# [4.3.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.2...v4.3.0-pre.3) (2019-08-19) - -### Bug Fixes - -- Update all dependencies ([7d53a00](https://github.com/feathersjs/feathers/commit/7d53a00)) - -# [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/rest-client - -# [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/rest-client - -# [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/rest-client - -# [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/rest-client - -# [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) - -**Note:** Version bump only for package @feathersjs/rest-client - -# [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 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)) - -### 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)) - -## [1.4.7](https://github.com/feathersjs/feathers/compare/@feathersjs/rest-client@1.4.6...@feathersjs/rest-client@1.4.7) (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)) - - - -## [1.4.6](https://github.com/feathersjs/feathers/compare/@feathersjs/rest-client@1.4.5...@feathersjs/rest-client@1.4.6) (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)) - - - -## [1.4.5](https://github.com/feathersjs/feathers/compare/@feathersjs/rest-client@1.4.4...@feathersjs/rest-client@1.4.5) (2018-09-21) - -**Note:** Version bump only for package @feathersjs/rest-client - - - -## [1.4.4](https://github.com/feathersjs/feathers/compare/@feathersjs/rest-client@1.4.3...@feathersjs/rest-client@1.4.4) (2018-09-17) - -**Note:** Version bump only for package @feathersjs/rest-client - - - -## [1.4.3](https://github.com/feathersjs/feathers/compare/@feathersjs/rest-client@1.4.2...@feathersjs/rest-client@1.4.3) (2018-09-02) - -**Note:** Version bump only for package @feathersjs/rest-client - - - -## 1.4.2 - -- Migrate to Monorepo ([feathers#462](https://github.com/feathersjs/feathers/issues/462)) - -## [v1.4.1](https://github.com/feathersjs/rest-client/tree/v1.4.1) (2018-06-27) - -[Full Changelog](https://github.com/feathersjs/rest-client/compare/v1.4.0...v1.4.1) - -**Merged pull requests:** - -- URL encode ID. [\#33](https://github.com/feathersjs/rest-client/pull/33) ([SteffenLanger](https://github.com/SteffenLanger)) -- Update shx to the latest version 🚀 [\#31](https://github.com/feathersjs/rest-client/pull/31) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v1.4.0](https://github.com/feathersjs/rest-client/tree/v1.4.0) (2018-05-17) - -[Full Changelog](https://github.com/feathersjs/rest-client/compare/v1.3.4...v1.4.0) - -**Closed issues:** - -- Need a way to abort requests [\#29](https://github.com/feathersjs/rest-client/issues/29) -- Pass request options to transport \(request\) [\#26](https://github.com/feathersjs/rest-client/issues/26) - -**Merged pull requests:** - -- Add support for passing library options in params.connection [\#30](https://github.com/feathersjs/rest-client/pull/30) ([daffl](https://github.com/daffl)) -- Update dependencies to enable Greenkeeper 🌴 [\#28](https://github.com/feathersjs/rest-client/pull/28) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v1.3.4](https://github.com/feathersjs/rest-client/tree/v1.3.4) (2018-03-17) - -[Full Changelog](https://github.com/feathersjs/rest-client/compare/v1.3.3...v1.3.4) - -**Closed issues:** - -- Window.fetch on macOS [\#24](https://github.com/feathersjs/rest-client/issues/24) -- Error on server side rendering [\#23](https://github.com/feathersjs/rest-client/issues/23) - -**Merged pull requests:** - -- Properly serialize ECONNREFUSED errors [\#27](https://github.com/feathersjs/rest-client/pull/27) ([daffl](https://github.com/daffl)) -- Update axios to the latest version 🚀 [\#25](https://github.com/feathersjs/rest-client/pull/25) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update node-fetch to the latest version 🚀 [\#22](https://github.com/feathersjs/rest-client/pull/22) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update mocha to the latest version 🚀 [\#21](https://github.com/feathersjs/rest-client/pull/21) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v1.3.3](https://github.com/feathersjs/rest-client/tree/v1.3.3) (2018-01-03) - -[Full Changelog](https://github.com/feathersjs/rest-client/compare/v1.3.2...v1.3.3) - -**Closed issues:** - -- Conditions, like { name: null } , to query resources can't be used. [\#18](https://github.com/feathersjs/rest-client/issues/18) -- Failed to minify the code from /lib/base.js [\#14](https://github.com/feathersjs/rest-client/issues/14) - -**Merged pull requests:** - -- Update documentation to correspond with latest release [\#20](https://github.com/feathersjs/rest-client/pull/20) ([daffl](https://github.com/daffl)) -- Update semistandard to the latest version 🚀 [\#19](https://github.com/feathersjs/rest-client/pull/19) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update feathers-memory to the latest version 🚀 [\#17](https://github.com/feathersjs/rest-client/pull/17) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v1.3.2](https://github.com/feathersjs/rest-client/tree/v1.3.2) (2017-11-16) - -[Full Changelog](https://github.com/feathersjs/rest-client/compare/v1.3.1...v1.3.2) - -**Merged pull requests:** - -- Add default export for better ES module \(TypeScript\) compatibility [\#16](https://github.com/feathersjs/rest-client/pull/16) ([daffl](https://github.com/daffl)) -- Update package.json [\#15](https://github.com/feathersjs/rest-client/pull/15) ([frank-dspeed](https://github.com/frank-dspeed)) -- Update @angular/platform-browser to the latest version 🚀 [\#13](https://github.com/feathersjs/rest-client/pull/13) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update @angular/http to the latest version 🚀 [\#12](https://github.com/feathersjs/rest-client/pull/12) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update @angular/core to the latest version 🚀 [\#11](https://github.com/feathersjs/rest-client/pull/11) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update @angular/common to the latest version 🚀 [\#10](https://github.com/feathersjs/rest-client/pull/10) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v1.3.1](https://github.com/feathersjs/rest-client/tree/v1.3.1) (2017-11-01) - -[Full Changelog](https://github.com/feathersjs/rest-client/compare/v1.3.0...v1.3.1) - -**Merged pull requests:** - -- Update dependencies [\#9](https://github.com/feathersjs/rest-client/pull/9) ([daffl](https://github.com/daffl)) -- Update babelify to the latest version 🚀 [\#8](https://github.com/feathersjs/rest-client/pull/8) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v1.3.0](https://github.com/feathersjs/rest-client/tree/v1.3.0) (2017-10-23) - -[Full Changelog](https://github.com/feathersjs/rest-client/compare/v1.2.0...v1.3.0) - -**Merged pull requests:** - -- Update all dependencies to use npm scope [\#7](https://github.com/feathersjs/rest-client/pull/7) ([daffl](https://github.com/daffl)) -- Update axios to the latest version 🚀 [\#6](https://github.com/feathersjs/rest-client/pull/6) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v1.2.0](https://github.com/feathersjs/rest-client/tree/v1.2.0) (2017-10-19) - -[Full Changelog](https://github.com/feathersjs/rest-client/compare/v1.1.1-0...v1.2.0) - -## [v1.1.1-0](https://github.com/feathersjs/rest-client/tree/v1.1.1-0) (2017-10-19) - -[Full Changelog](https://github.com/feathersjs/rest-client/compare/v1.1.0...v1.1.1-0) - -**Merged pull requests:** - -- Rename repository to publish in npm namespace [\#5](https://github.com/feathersjs/rest-client/pull/5) ([daffl](https://github.com/daffl)) -- Upgrade to use Feathers v3 [\#4](https://github.com/feathersjs/rest-client/pull/4) ([daffl](https://github.com/daffl)) -- Update mocha to the latest version 🚀 [\#3](https://github.com/feathersjs/rest-client/pull/3) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v1.1.0](https://github.com/feathersjs/rest-client/tree/v1.1.0) (2017-07-20) - -[Full Changelog](https://github.com/feathersjs/rest-client/compare/v1.0.0...v1.1.0) - -**Merged pull requests:** - -- add support for @angular/common/http \(HttpClient\) [\#2](https://github.com/feathersjs/rest-client/pull/2) ([j2L4e](https://github.com/j2L4e)) - -## [v1.0.0](https://github.com/feathersjs/rest-client/tree/v1.0.0) (2017-07-16) - -**Merged pull requests:** - -- Update dependencies to enable Greenkeeper 🌴 [\#1](https://github.com/feathersjs/rest-client/pull/1) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -\* _This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)_ diff --git a/packages/rest-client/LICENSE b/packages/rest-client/LICENSE deleted file mode 100644 index 7712f870f3..0000000000 --- a/packages/rest-client/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2024 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 -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -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 deleted file mode 100644 index a43e3e8e7c..0000000000 --- a/packages/rest-client/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# @feathersjs/rest-client - -[![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/rest-client.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/rest-client) -[![Discord](https://badgen.net/badge/icon/discord?icon=discord&label)](https://discord.gg/qa8kez8QBx) - -> REST client services for different HTTP libraries - -## Installation - -``` -npm install @feathersjs/rest-client --save -``` - -## Documentation - -Refer to the [Feathers REST client API documentation](https://feathersjs.com/api/client/rest.html) 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/rest-client/package.json b/packages/rest-client/package.json deleted file mode 100644 index f5a1e79f03..0000000000 --- a/packages/rest-client/package.json +++ /dev/null @@ -1,80 +0,0 @@ -{ - "name": "@feathersjs/rest-client", - "description": "REST client services for different Ajax libraries", - "version": "5.0.34", - "homepage": "https://feathersjs.com", - "main": "lib/", - "types": "lib/", - "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", - "directory": "packages/rest-client" - }, - "author": { - "name": "Feathers contributors", - "email": "hello@feathersjs.com", - "url": "https://feathersjs.com" - }, - "contributors": [], - "bugs": { - "url": "https://github.com/feathersjs/feathers/issues" - }, - "engines": { - "node": ">= 12" - }, - "files": [ - "CHANGELOG.md", - "LICENSE", - "README.md", - "src/**", - "lib/**", - "*.d.ts", - "*.js" - ], - "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" - }, - "directories": { - "lib": "lib" - }, - "publishConfig": { - "access": "public" - }, - "dependencies": { - "@feathersjs/commons": "^5.0.34", - "@feathersjs/errors": "^5.0.34", - "@feathersjs/feathers": "^5.0.34", - "@types/superagent": "^8.1.9", - "qs": "^6.14.0" - }, - "devDependencies": { - "@feathersjs/express": "^5.0.34", - "@feathersjs/memory": "^5.0.34", - "@feathersjs/tests": "^5.0.34", - "@types/mocha": "^10.0.10", - "@types/node": "^24.1.0", - "@types/node-fetch": "^2.6.13", - "@types/qs": "^6.14.0", - "axios": "^1.11.0", - "mocha": "^11.7.1", - "node-fetch": "^2.6.1", - "rxjs": "^7.8.2", - "shx": "^0.4.0", - "superagent": "^10.2.3", - "ts-node": "^10.9.2", - "typescript": "^5.9.2" - }, - "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" -} diff --git a/packages/rest-client/src/axios.ts b/packages/rest-client/src/axios.ts deleted file mode 100644 index 16a2194867..0000000000 --- a/packages/rest-client/src/axios.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { Params } from '@feathersjs/feathers' -import { Base, RestClientParams } from './base' - -export class AxiosClient, P extends Params = RestClientParams> extends Base { - request(options: any, params: RestClientParams) { - const config = Object.assign( - { - url: options.url, - method: options.method, - data: options.body, - headers: Object.assign( - { - Accept: 'application/json' - }, - this.options.headers, - options.headers - ) - }, - params.connection - ) - - return this.connection - .request(config) - .then((res: any) => res.data) - .catch((error: any) => { - const response = error.response || error - - throw response instanceof Error ? response : response.data || response - }) - } -} diff --git a/packages/rest-client/src/base.ts b/packages/rest-client/src/base.ts deleted file mode 100644 index 6e337d784e..0000000000 --- a/packages/rest-client/src/base.ts +++ /dev/null @@ -1,212 +0,0 @@ -import qs from 'qs' -import { Params, Id, Query, NullableId, ServiceInterface } from '@feathersjs/feathers' -import { Unavailable, convert } from '@feathersjs/errors' -import { _, stripSlashes } from '@feathersjs/commons' - -function toError(error: Error & { code: string }) { - if (error.code === 'ECONNREFUSED') { - throw new Unavailable(error.message, _.pick(error, 'address', 'port', 'config')) - } - - throw convert(error) -} - -export interface RestClientParams extends Params { - connection?: any -} - -interface RestClientSettings { - name: string - base: string - connection: any - options: any -} - -export abstract class Base, P extends Params = RestClientParams> - implements ServiceInterface -{ - name: string - base: string - connection: any - options: any - - constructor(settings: RestClientSettings) { - this.name = stripSlashes(settings.name) - this.options = settings.options - this.connection = settings.connection - this.base = `${settings.base}/${this.name}` - } - - makeUrl(query: Query, id?: string | number | null, route?: { [key: string]: string }) { - let url = this.base - - if (route) { - Object.keys(route).forEach((key) => { - url = url.replace(`:${key}`, route[key]) - }) - } - - query = query || {} - - if (typeof id !== 'undefined' && id !== null) { - url += `/${encodeURIComponent(id)}` - } - - return url + this.getQuery(query) - } - - getQuery(query: Query) { - if (Object.keys(query).length !== 0) { - const queryString = qs.stringify(query) - - return `?${queryString}` - } - - return '' - } - - abstract request(options: any, params: P): any - - methods(this: any, ...names: string[]) { - names.forEach((method) => { - const _method = `_${method}` - this[_method] = function (data: any, params: Params = {}) { - return this.request( - { - body: data, - url: this.makeUrl(params.query, null, params.route), - method: 'POST', - headers: Object.assign( - { - 'Content-Type': 'application/json', - 'X-Service-Method': method - }, - params.headers - ) - }, - params - ).catch(toError) - } - this[method] = function (data: any, params: Params = {}) { - return this[_method](data, params) - } - }) - - return this - } - - _find(params?: P) { - return this.request( - { - url: this.makeUrl(params.query, null, params.route), - method: 'GET', - headers: Object.assign({}, params.headers) - }, - params - ).catch(toError) - } - - find(params?: P) { - return this._find(params) - } - - _get(id: Id, params?: P) { - if (typeof id === 'undefined') { - return Promise.reject(new Error("id for 'get' can not be undefined")) - } - - return this.request( - { - url: this.makeUrl(params.query, id, params.route), - method: 'GET', - headers: Object.assign({}, params.headers) - }, - params - ).catch(toError) - } - - get(id: Id, params?: P) { - return this._get(id, params) - } - - _create(data: D, params?: P) { - return this.request( - { - url: this.makeUrl(params.query, null, params.route), - body: data, - method: 'POST', - headers: Object.assign({ 'Content-Type': 'application/json' }, params.headers) - }, - params - ).catch(toError) - } - - create(data: D, params?: P) { - return this._create(data, params) - } - - _update(id: NullableId, data: D, params?: P) { - if (typeof id === 'undefined') { - return Promise.reject( - new Error("id for 'update' can not be undefined, only 'null' when updating multiple entries") - ) - } - - return this.request( - { - url: this.makeUrl(params.query, id, params.route), - body: data, - method: 'PUT', - headers: Object.assign({ 'Content-Type': 'application/json' }, params.headers) - }, - params - ).catch(toError) - } - - update(id: NullableId, data: D, params?: P) { - return this._update(id, data, params) - } - - _patch(id: NullableId, data: D, params?: P) { - if (typeof id === 'undefined') { - return Promise.reject( - new Error("id for 'patch' can not be undefined, only 'null' when updating multiple entries") - ) - } - - return this.request( - { - url: this.makeUrl(params.query, id, params.route), - body: data, - method: 'PATCH', - headers: Object.assign({ 'Content-Type': 'application/json' }, params.headers) - }, - params - ).catch(toError) - } - - patch(id: NullableId, data: D, params?: P) { - return this._patch(id, data, params) - } - - _remove(id: NullableId, params?: P) { - if (typeof id === 'undefined') { - return Promise.reject( - new Error("id for 'remove' can not be undefined, only 'null' when removing multiple entries") - ) - } - - return this.request( - { - url: this.makeUrl(params.query, id, params.route), - method: 'DELETE', - headers: Object.assign({}, params.headers) - }, - params - ).catch(toError) - } - - remove(id: NullableId, params?: P) { - return this._remove(id, params) - } -} diff --git a/packages/rest-client/src/fetch.ts b/packages/rest-client/src/fetch.ts deleted file mode 100644 index 724fbfc293..0000000000 --- a/packages/rest-client/src/fetch.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { errors } from '@feathersjs/errors' -import { Params } from '@feathersjs/feathers' -import { Base, RestClientParams } from './base' - -export class FetchClient, P extends Params = RestClientParams> extends Base { - request(options: any, params: RestClientParams) { - const fetchOptions = Object.assign({}, options, params.connection) - - fetchOptions.headers = Object.assign( - { - Accept: 'application/json' - }, - this.options.headers, - fetchOptions.headers - ) - - if (options.body) { - fetchOptions.body = JSON.stringify(options.body) - } - - return this.connection(options.url, fetchOptions) - .then(this.checkStatus) - .then((response: any) => { - if (response.status === 204) { - return null - } - - return response.json() - }) - } - - checkStatus(response: any) { - if (response.ok) { - return response - } - - return response - .json() - .catch(() => { - const ErrorClass = (errors as any)[response.status] || Error - - return new ErrorClass('JSON parsing error') - }) - .then((error: any) => { - error.response = response - throw error - }) - } -} diff --git a/packages/rest-client/src/index.ts b/packages/rest-client/src/index.ts deleted file mode 100644 index d0afbaf7a5..0000000000 --- a/packages/rest-client/src/index.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { Application, TransportConnection, defaultServiceMethods } from '@feathersjs/feathers' - -import { Base } from './base' -import { AxiosClient } from './axios' -import { FetchClient } from './fetch' -import { SuperagentClient } from './superagent' - -export { AxiosClient, FetchClient, SuperagentClient } - -const transports = { - superagent: SuperagentClient, - fetch: FetchClient, - axios: AxiosClient -} - -export type Handler = ( - connection: any, - options?: any, - Service?: any -) => TransportConnection - -export interface Transport { - superagent: Handler - fetch: Handler - axios: Handler -} - -export type RestService> = Base - -export default function restClient(base = '') { - const result: any = { Base } - - Object.keys(transports).forEach((key) => { - result[key] = function (connection: any, options: any = {}, Service: Base = (transports as any)[key]) { - if (!connection) { - throw new Error(`${key} has to be provided to feathers-rest`) - } - - if (typeof options === 'function') { - Service = options - options = {} - } - - const defaultService = function (name: string) { - return new (Service as any)({ base, name, connection, options }) - } - - const initialize = (app: Application & { rest: any }) => { - if (app.rest !== undefined) { - throw new Error('Only one default client provider can be configured') - } - - app.rest = connection - app.defaultService = defaultService - app.mixins.unshift((service, _location, options) => { - if (options && options.methods && service instanceof Base) { - const customMethods = options.methods.filter((name) => !defaultServiceMethods.includes(name)) - - service.methods(...customMethods) - } - }) - } - - initialize.Service = Service - initialize.service = defaultService - - return initialize - } - }) - - return result as Transport -} - -if (typeof module !== 'undefined') { - module.exports = Object.assign(restClient, module.exports) -} diff --git a/packages/rest-client/src/superagent.ts b/packages/rest-client/src/superagent.ts deleted file mode 100644 index d93474b69f..0000000000 --- a/packages/rest-client/src/superagent.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { Params } from '@feathersjs/feathers' -import { Base, RestClientParams } from './base' - -export class SuperagentClient, P extends Params = RestClientParams> extends Base< - T, - D, - P -> { - request(options: any, params: RestClientParams) { - const superagent = this.connection(options.method, options.url) - .set(this.options.headers || {}) - .set('Accept', 'application/json') - .set(params.connection || {}) - .set(options.headers || {}) - .type(options.type || 'json') - - return new Promise((resolve, reject) => { - superagent.set(options.headers) - - if (options.body) { - superagent.send(options.body) - } - - superagent.end(function (error: any, res: any) { - if (error) { - try { - const response = error.response - error = JSON.parse(error.response.text) - error.response = response - } catch (e: any) {} - - return reject(error) - } - - resolve(res && res.body) - }) - }) - } -} diff --git a/packages/rest-client/test/axios.test.ts b/packages/rest-client/test/axios.test.ts deleted file mode 100644 index 16cfe9635b..0000000000 --- a/packages/rest-client/test/axios.test.ts +++ /dev/null @@ -1,134 +0,0 @@ -import { strict as assert } from 'assert' - -import axios from 'axios' -import { Server } from 'http' -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' - -describe('Axios REST connector', function () { - const url = 'http://localhost:8889' - const connection = rest(url).axios(axios) - const app = feathers() - .configure(connection) - .use('todos', connection.service('todos'), { - methods: ['get', 'find', 'create', 'patch', 'customMethod'] - }) - const service = app.service('todos') - let server: Server - - before(async () => { - server = await createServer().listen(8889) - }) - - after((done) => server.close(done)) - - it('supports custom headers', async () => { - const headers = { - Authorization: 'let-me-in' - } - - const todo = await service.get(0, { headers }) - - assert.deepStrictEqual(todo, { - id: 0, - authorization: 'let-me-in', - text: 'some todo', - complete: false, - query: {} - }) - }) - - it('uses params.connection for additional options', async () => { - const connection = { - headers: { - Authorization: 'let-me-in' - } - } - - const todo = await service.get(0, { connection }) - - assert.deepStrictEqual(todo, { - id: 0, - authorization: 'let-me-in', - text: 'some todo', - complete: false, - query: {} - }) - }) - - it('can initialize a client instance', async () => { - const init = rest(url).axios(axios) - const todoService = init.service('todos') - - assert.ok(todoService instanceof init.Service, 'Returned service is a client') - - const todos = await todoService.find({}) - - assert.deepStrictEqual(todos, [ - { - text: 'some todo', - complete: false, - id: 0 - } - ]) - }) - - it('supports nested arrays in queries', async () => { - const query = { test: { $in: ['0', '1', '2'] } } - - const data = await service.get(0, { query }) - - assert.deepStrictEqual(data.query, query) - }) - - it('remove many', async () => { - const todo: any = await service.remove(null) - - assert.strictEqual(todo.id, null) - assert.strictEqual(todo.text, 'deleted many') - }) - - it('converts feathers errors (#50)', async () => { - try { - await service.get(0, { query: { feathersError: true } }) - assert.fail('Should never get here') - } catch (error: any) { - assert.ok(error instanceof NotAcceptable) - assert.strictEqual(error.message, 'This is a Feathers error') - assert.strictEqual(error.code, 406) - } - }) - - it('ECONNREFUSED errors are serializable', async () => { - const url = 'http://localhost:60000' - const setup = rest(url).axios(axios) - const app = feathers().configure(setup) - - try { - await app.service('something').find() - assert.fail('Should never get here') - } catch (e: any) { - const err = JSON.parse(JSON.stringify(e)) - - assert.strictEqual(err.name, 'Unavailable') - assert.ok(e.data.config) - } - }) - - it('works with custom method .customMethod', async () => { - const result = await service.customMethod({ message: 'hi' }) - - assert.deepEqual(result, { - data: { message: 'hi' }, - provider: 'rest', - type: 'customMethod' - }) - }) - - clientTests(service, 'todos') -}) diff --git a/packages/rest-client/test/declarations.ts b/packages/rest-client/test/declarations.ts deleted file mode 100644 index a29a067e10..0000000000 --- a/packages/rest-client/test/declarations.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { CustomMethod } from '@feathersjs/feathers' -import { RestService } from '../src' - -type Data = { message: string } -type Result = { - data: Data - provider: string - type: string -} - -export type ServiceTypes = { - todos: RestService & { - customMethod: CustomMethod - } -} diff --git a/packages/rest-client/test/fetch.test.ts b/packages/rest-client/test/fetch.test.ts deleted file mode 100644 index 54ea3cec8e..0000000000 --- a/packages/rest-client/test/fetch.test.ts +++ /dev/null @@ -1,147 +0,0 @@ -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' - -describe('fetch REST connector', function () { - const url = 'http://localhost:8889' - const connection = rest(url).fetch(fetch) - const app = feathers() - .configure(connection) - .use('todos', connection.service('todos'), { - methods: ['get', 'find', 'create', 'patch', 'customMethod'] - }) - - const service = app.service('todos') - let server: Server - - service.hooks({ - after: { - customMethod: [ - (context) => { - context.result.data.message += '!' - } - ] - } - }) - - before(async () => { - server = await createServer().listen(8889) - }) - - after((done) => server.close(done)) - - it('supports custom headers', async () => { - const headers = { - Authorization: 'let-me-in' - } - - const todo = await service.get(0, { headers }) - - assert.deepStrictEqual(todo, { - id: 0, - text: 'some todo', - authorization: 'let-me-in', - complete: false, - query: {} - }) - }) - - it('supports params.connection', async () => { - const connection = { - headers: { - Authorization: 'let-me-in' - } - } - - const todo = await service.get(0, { connection }) - - assert.deepStrictEqual(todo, { - id: 0, - text: 'some todo', - authorization: 'let-me-in', - complete: false, - query: {} - }) - }) - - it('handles errors properly', async () => { - try { - await service.get(-1, {}) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.code, 404) - } - }) - - it('supports nested arrays in queries', async () => { - const query = { test: { $in: ['0', '1', '2'] } } - - const data = await service.get(0, { query }) - - assert.deepStrictEqual(data.query, query) - }) - - it('can initialize a client instance', async () => { - const init = rest(url).fetch(fetch) - const todoService = init.service('todos') - - assert.ok(todoService instanceof init.Service, 'Returned service is a client') - - const todos = await todoService.find({}) - - assert.deepStrictEqual(todos, [ - { - text: 'some todo', - complete: false, - id: 0 - } - ]) - }) - - it('remove many', async () => { - const todo: any = await service.remove(null) - - assert.strictEqual(todo.id, null) - assert.strictEqual(todo.text, 'deleted many') - }) - - it('converts feathers errors (#50)', async () => { - try { - await service.get(0, { query: { feathersError: true } }) - assert.fail('Should never get here') - } catch (error: any) { - assert.ok(error.response) - assert.ok(error instanceof NotAcceptable) - assert.strictEqual(error.message, 'This is a Feathers error') - assert.strictEqual(error.code, 406) - assert.deepStrictEqual(error.data, { data: true }) - } - }) - - it('returns null for 204 responses', async () => { - const response = await service.remove(0, { - query: { noContent: true } - }) - - assert.strictEqual(response, null) - }) - - it('works with custom method .customMethod', async () => { - const result = await service.customMethod({ message: 'hi' }) - - assert.deepEqual(result, { - data: { message: 'hi!' }, - provider: 'rest', - type: 'customMethod' - }) - }) - - clientTests(service, 'todos') -}) diff --git a/packages/rest-client/test/index.test.ts b/packages/rest-client/test/index.test.ts deleted file mode 100644 index d81c98407b..0000000000 --- a/packages/rest-client/test/index.test.ts +++ /dev/null @@ -1,175 +0,0 @@ -/* 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' - -describe('REST client tests', function () { - it('is built correctly', () => { - const transports = init() - - assert.strictEqual(typeof init, 'function') - assert.strictEqual(typeof transports.superagent, 'function') - assert.strictEqual(typeof transports.fetch, 'function') - assert.strictEqual(typeof transports.axios, 'function') - }) - - it('throw errors when no connection is provided', () => { - const transports = init() - - try { - // @ts-ignore - transports.fetch() - } catch (e: any) { - assert.strictEqual(e.message, 'fetch has to be provided to feathers-rest') - } - }) - - it('app has the rest attribute', () => { - const app = feathers() - - app.configure(init('http://localhost:8889').fetch(fetch)) - - assert.ok((app as any).rest) - }) - - it('throws an error when configured twice', () => { - const app = feathers() - - app.configure(init('http://localhost:8889').fetch(fetch)) - - try { - app.configure(init('http://localhost:8889').fetch(fetch)) - assert.ok(false, 'Should never get here') - } catch (e: any) { - assert.strictEqual(e.message, 'Only one default client provider can be configured') - } - }) - - it('errors when id property for get, patch, update or remove is undefined', async () => { - const app = feathers().configure(init('http://localhost:8889').fetch(fetch)) - - const service = app.service('todos') - - await assert.rejects(() => service.get(undefined), { - message: "id for 'get' can not be undefined" - }) - - await assert.rejects(() => service.remove(undefined), { - message: "id for 'remove' can not be undefined, only 'null' when removing multiple entries" - }) - - await assert.rejects(() => service.update(undefined, {}), { - message: "id for 'update' can not be undefined, only 'null' when updating multiple entries" - }) - - await assert.rejects(() => service.patch(undefined, {}), { - message: "id for 'patch' can not be undefined, only 'null' when updating multiple entries" - }) - }) - - it('uses a custom client', async () => { - const app = feathers() - class MyFetchClient extends FetchClient { - find() { - return Promise.resolve({ - connection: this.connection, - base: this.base, - message: 'Custom fetch client' - }) - } - } - - app.configure(init('http://localhost:8889').fetch(fetch, {}, MyFetchClient)) - - const data = await app.service('messages').find() - - assert.deepStrictEqual(data, { - connection: fetch, - base: 'http://localhost:8889/messages', - message: 'Custom fetch client' - }) - }) - - it('uses a custom client as second arg', async () => { - const app = feathers() - class MyFetchClient extends FetchClient { - find() { - return Promise.resolve({ - connection: this.connection, - base: this.base, - message: 'Custom fetch client' - }) - } - } - - app.configure(init('http://localhost:8889').fetch(fetch, MyFetchClient)) - - const data = await app.service('messages').find() - - assert.deepStrictEqual(data, { - connection: fetch, - base: 'http://localhost:8889/messages', - message: 'Custom fetch client' - }) - }) - - it('replace placeholder in route URLs', async () => { - const app = feathers() - let expectedValue: string | null = null - class MyFetchClient extends FetchClient { - request(options: any, _params: any) { - assert.equal(options.url, expectedValue) - return Promise.resolve() - } - } - app.configure(init('http://localhost:8889').fetch(fetch, {}, MyFetchClient)) - - expectedValue = 'http://localhost:8889/admin/todos' - await app.service(':slug/todos').find({ - route: { - slug: 'admin' - } - }) - await app.service(':slug/todos').create( - {}, - { - route: { - slug: 'admin' - } - } - ) - expectedValue = 'http://localhost:8889/admin/todos/0' - await app.service(':slug/todos').get(0, { - route: { - slug: 'admin' - } - }) - expectedValue = 'http://localhost:8889/admin/todos/0' - await app.service(':slug/todos').patch( - 0, - {}, - { - route: { - slug: 'admin' - } - } - ) - expectedValue = 'http://localhost:8889/admin/todos/0' - await app.service(':slug/todos').update( - 0, - {}, - { - route: { - slug: 'admin' - } - } - ) - expectedValue = 'http://localhost:8889/admin/todos/0' - await app.service(':slug/todos').remove(0, { - route: { - slug: 'admin' - } - }) - }) -}) diff --git a/packages/rest-client/test/server.ts b/packages/rest-client/test/server.ts deleted file mode 100644 index 6027f47180..0000000000 --- a/packages/rest-client/test/server.ts +++ /dev/null @@ -1,131 +0,0 @@ -import { feathers, Id, NullableId, Params } from '@feathersjs/feathers' -import expressify, { rest, urlencoded, json } from '@feathersjs/express' -import { MemoryService } from '@feathersjs/memory' -import { FeathersError, NotAcceptable } from '@feathersjs/errors' - -// eslint-disable-next-line no-extend-native -Object.defineProperty(Error.prototype, 'toJSON', { - value() { - const alt: any = {} - - Object.getOwnPropertyNames(this).forEach((key: string) => { - alt[key] = this[key] - }, this) - - return alt - }, - configurable: true, - writable: true -}) - -const errorHandler = function (error: FeathersError, _req: any, res: any, _next: any) { - // eslint-disable-line @typescript-eslint/no-unused-vars - const code = !isNaN(parseInt(error.code as any, 10)) ? parseInt(error.code as any, 10) : 500 - res.status(code) - - res.format({ - 'application/json'() { - res.json(Object.assign({}, error.toJSON())) - } - }) -} - -interface TodoServiceParams extends Params { - authorization: any -} - -// Create an in-memory CRUD service for our Todos -class TodoService extends MemoryService { - get(id: Id, params: TodoServiceParams) { - if (params.query.error) { - throw new Error('Something went wrong') - } - - if (params.query.feathersError) { - throw new NotAcceptable('This is a Feathers error', { data: true }) - } - - return super.get(id).then((data) => { - console.log('!', params.query) - const result = Object.assign({ query: params.query }, data) - - if (params.authorization) { - result.authorization = params.authorization - } - - return result - }) - } - - remove(id: NullableId, params: Params) { - if (id === null) { - return Promise.resolve({ - id, - text: 'deleted many' - }) - } - - if (params.query.noContent) { - return Promise.resolve() - } - - return super.remove(id, params) - } - - async customMethod(data: any, { provider }: Params) { - return { - data, - provider, - type: 'customMethod' - } - } -} - -export default (configurer?: any) => { - const app = expressify(feathers()) - .use(function (req, res, next) { - res.header('Access-Control-Allow-Origin', '*') - res.header('Access-Control-Allow-Headers', 'Authorization') - req.feathers = { - ...req.feathers, - authorization: req.headers.authorization - } - next() - }) - // Parse HTTP bodies - .use(json()) - .use(urlencoded({ extended: true })) - .configure( - rest(function formatter(_req, res, next) { - if (!res.data) { - next() - } - - res.format({ - html() { - res.end('

This is HTML content. You should not see it.

') - }, - - json() { - res.json(res.data) - } - }) - }) - ) - // Host our Todos service on the /todos path - .use('todos', new TodoService(), { - methods: ['find', 'get', 'create', 'patch', 'update', 'remove', 'customMethod'] - }) - .use(errorHandler) - - if (typeof configurer === 'function') { - configurer.call(app) - } - - app.service('todos').create({ - text: 'some todo', - complete: false - }) - - return app -} diff --git a/packages/rest-client/test/superagent.test.ts b/packages/rest-client/test/superagent.test.ts deleted file mode 100644 index 7e705b4288..0000000000 --- a/packages/rest-client/test/superagent.test.ts +++ /dev/null @@ -1,116 +0,0 @@ -import { strict as assert } from 'assert' - -import superagent from 'superagent' -import { Server } from 'http' -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' - -describe('Superagent REST connector', function () { - let server: Server - - const url = 'http://localhost:8889' - const setup = rest(url).superagent(superagent) - const app = feathers().configure(setup) - const service = app.service('todos') - - service.methods('customMethod') - - before(async () => { - server = await createServer().listen(8889) - }) - - after((done) => server.close(done)) - - it('supports custom headers', async () => { - const headers = { - Authorization: 'let-me-in' - } - - const todo = await service.get(0, { headers }) - - assert.deepStrictEqual(todo, { - id: 0, - authorization: 'let-me-in', - text: 'some todo', - complete: false, - query: {} - }) - }) - - it('supports params.connection', async () => { - const connection = { - Authorization: 'let-me-in' - } - - const todo = await service.get(0, { connection }) - - assert.deepStrictEqual(todo, { - id: 0, - authorization: 'let-me-in', - text: 'some todo', - complete: false, - query: {} - }) - }) - - it('can initialize a client instance', async () => { - const init = rest(url).superagent(superagent) - const todoService = init.service('todos') - - assert.ok(todoService instanceof init.Service, 'Returned service is a client') - - const todos = await todoService.find({}) - - assert.deepStrictEqual(todos, [ - { - text: 'some todo', - complete: false, - id: 0 - } - ]) - }) - - it('supports nested arrays in queries', async () => { - const query = { test: { $in: ['0', '1', '2'] } } - - const data = await service.get(0, { query }) - - assert.deepStrictEqual(data.query, query) - }) - - it('remove many', async () => { - const todo: any = await service.remove(null) - - assert.strictEqual(todo.id, null) - assert.strictEqual(todo.text, 'deleted many') - }) - - it('converts feathers errors (#50)', async () => { - try { - await service.get(0, { query: { feathersError: true } }) - assert.fail('Should never get here') - } catch (error: any) { - assert.ok(error.response) - assert.ok(error instanceof NotAcceptable) - assert.strictEqual(error.message, 'This is a Feathers error') - assert.strictEqual(error.code, 406) - } - }) - - it('works with custom method .customMethod', async () => { - const result = await service.customMethod({ message: 'hi' }) - - assert.deepEqual(result, { - data: { message: 'hi' }, - provider: 'rest', - type: 'customMethod' - }) - }) - - clientTests(service, 'todos') -}) diff --git a/packages/rest-client/tsconfig.json b/packages/rest-client/tsconfig.json deleted file mode 100644 index 316fd41336..0000000000 --- a/packages/rest-client/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig", - "include": [ - "src/**/*.ts" - ], - "compilerOptions": { - "outDir": "lib" - } -} diff --git a/packages/schema/CHANGELOG.md b/packages/schema/CHANGELOG.md deleted file mode 100644 index 4bb0da6042..0000000000 --- a/packages/schema/CHANGELOG.md +++ /dev/null @@ -1,390 +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.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/schema - -## [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/schema - -## [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/schema - -## [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/schema - -## [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/schema - -## [5.0.26](https://github.com/feathersjs/feathers/compare/v5.0.25...v5.0.26) (2024-06-09) - -### Bug Fixes - -- **schema:** Allow regular functions in resolvers ([#3487](https://github.com/feathersjs/feathers/issues/3487)) ([187868e](https://github.com/feathersjs/feathers/commit/187868edd9c0c9d885c482b85be7a90655c86ca2)) - -## [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/schema - -## [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/schema - -## [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/schema - -## [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/schema - -## [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/schema - -## [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/schema - -## [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/schema - -## [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/schema - -## [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/schema - -## [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/schema - -## [5.0.14](https://github.com/feathersjs/feathers/compare/v5.0.13...v5.0.14) (2024-01-05) - -### Bug Fixes - -- **schema:** Fix setting dispatch on existing nested objects ([#3380](https://github.com/feathersjs/feathers/issues/3380)) ([04efd5a](https://github.com/feathersjs/feathers/commit/04efd5ab3339beafa0e1a9ef851483a387c6ec96)) - -## [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/schema - -## [5.0.12](https://github.com/feathersjs/feathers/compare/v5.0.11...v5.0.12) (2023-11-28) - -### Bug Fixes - -- **schema:** Allow $in and $nin queries to work for arrays ([#3352](https://github.com/feathersjs/feathers/issues/3352)) ([677c214](https://github.com/feathersjs/feathers/commit/677c214a353a7f9a1f90649b9bbec4d0d6517a6f)) -- **schema:** Remove undefined $select when using resolveResult hook ([#3354](https://github.com/feathersjs/feathers/issues/3354)) ([c43e009](https://github.com/feathersjs/feathers/commit/c43e009188eb84f98e3f5f29ac4444e6967afc1f)) - -## [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) - -### Bug Fixes - -- **schema:** Add typescript as peerDependency ([#3287](https://github.com/feathersjs/feathers/issues/3287)) ([cb562ee](https://github.com/feathersjs/feathers/commit/cb562eeddfa88e34fe5727d4000fa037746b0249)) - -## [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/schema - -## [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/schema - -## [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/schema - -## [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/schema - -## [5.0.5](https://github.com/feathersjs/feathers/compare/v5.0.4...v5.0.5) (2023-04-28) - -### Bug Fixes - -- **schema:** Exclude json-schema-to-ts@2.8.0 ([#3180](https://github.com/feathersjs/feathers/issues/3180)) ([aee8531](https://github.com/feathersjs/feathers/commit/aee8531b5f0578f11e43b19a469b96e6f4b170ce)) - -## [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) - -### Bug Fixes - -- **core:** Use Symbol.for to instantiate shared symbols ([#3087](https://github.com/feathersjs/feathers/issues/3087)) ([7f3fc21](https://github.com/feathersjs/feathers/commit/7f3fc2167576f228f8183568eb52b077160e8d65)) -- **memory/mongodb:** $select as only property & force 'id' in '$select' ([#3081](https://github.com/feathersjs/feathers/issues/3081)) ([fbe3cf5](https://github.com/feathersjs/feathers/commit/fbe3cf5199e102b5aeda2ae33828d5034df3d105)) - -# [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/schema - -# [5.0.0-pre.38](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.37...v5.0.0-pre.38) (2023-02-17) - -### Bug Fixes - -- **schema:** validateQuery - move next function outside of try-catch ([#3053](https://github.com/feathersjs/feathers/issues/3053)) ([37fe5c4](https://github.com/feathersjs/feathers/commit/37fe5c4a4d813867f6d02098b7c77d08786248c7)) - -### Features - -- **schema:** Add schema helper for handling Object ids ([#3058](https://github.com/feathersjs/feathers/issues/3058)) ([1393bed](https://github.com/feathersjs/feathers/commit/1393bed81a9ee814de6aab0e537af83e667591a2)) - -# [5.0.0-pre.37](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.36...v5.0.0-pre.37) (2023-02-09) - -### Bug Fixes - -- **schema:** Do not change the hook context in resolvers ([#3048](https://github.com/feathersjs/feathers/issues/3048)) ([bfd8c04](https://github.com/feathersjs/feathers/commit/bfd8c04c15279063a0d4b70771715c656dda5f7c)) -- **schema:** Ensure that resolveResult and resolveExternal are run as around hooks ([#3032](https://github.com/feathersjs/feathers/issues/3032)) ([71942f4](https://github.com/feathersjs/feathers/commit/71942f418e3afe167aef4f98b1a97356dae7625c)) - -# [5.0.0-pre.36](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.35...v5.0.0-pre.36) (2023-01-29) - -### Bug Fixes - -- **configuration:** Add pool and connection object to SQL database default configuration ([#3023](https://github.com/feathersjs/feathers/issues/3023)) ([092c749](https://github.com/feathersjs/feathers/commit/092c749d43f7da4d019576d1210fe7d3719a44a2)) -- **databases:** Ensure that query sanitization is not necessary when using query schemas ([#3022](https://github.com/feathersjs/feathers/issues/3022)) ([dbf514e](https://github.com/feathersjs/feathers/commit/dbf514e85d1508b95c007462a39b3cadd4ff391d)) -- **schema:** Allow any type in resolver hooks ([#3006](https://github.com/feathersjs/feathers/issues/3006)) ([f01281f](https://github.com/feathersjs/feathers/commit/f01281f7d83262738459585fc3f53f56c0a0deb8)) -- **schema:** Ensure all types of nested data are securely dispatched ([#3005](https://github.com/feathersjs/feathers/issues/3005)) ([e4a9da5](https://github.com/feathersjs/feathers/commit/e4a9da5f3288e8e9f02087754473c7a9dfda6cb1)) -- Update all dependencies ([#3024](https://github.com/feathersjs/feathers/issues/3024)) ([283dc47](https://github.com/feathersjs/feathers/commit/283dc4798d85584bc031e6e54b83b4ea77d1edd0)) - -# [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)) -- **schema:** Allow to add additional operators to the query syntax ([#2941](https://github.com/feathersjs/feathers/issues/2941)) ([f324940](https://github.com/feathersjs/feathers/commit/f324940d5795b41e8c6fc113defb0beb7ab03a0a)) - -# [5.0.0-pre.34](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.33...v5.0.0-pre.34) (2022-12-14) - -### Bug Fixes - -- **core:** `context.type` for around hooks ([#2890](https://github.com/feathersjs/feathers/issues/2890)) ([d606ac6](https://github.com/feathersjs/feathers/commit/d606ac660fd5335c95206784fea36530dd2e851a)) -- **core:** Improve service option usage and method option typings ([#2902](https://github.com/feathersjs/feathers/issues/2902)) ([164d75c](https://github.com/feathersjs/feathers/commit/164d75c0f11139a316baa91f1762de8f8eb7da2d)) -- **schema:** Allow query schemas with no properties, error on unsupported types ([#2904](https://github.com/feathersjs/feathers/issues/2904)) ([b66c734](https://github.com/feathersjs/feathers/commit/b66c734357478f51b2d38fa7f3eee08640cea26e)) - -### Features - -- **adapter:** Add patch data type to adapters and refactor AdapterBase usage ([#2906](https://github.com/feathersjs/feathers/issues/2906)) ([9ddc2e6](https://github.com/feathersjs/feathers/commit/9ddc2e6b028f026f939d6af68125847e5c6734b4)) -- **cli:** Use separate patch schema and types ([#2916](https://github.com/feathersjs/feathers/issues/2916)) ([7088af6](https://github.com/feathersjs/feathers/commit/7088af64a539dc7f1a016d832b77b98aaaf92603)) -- **schema:** Split resolver options and property resolvers ([#2889](https://github.com/feathersjs/feathers/issues/2889)) ([4822c94](https://github.com/feathersjs/feathers/commit/4822c949812e5a1dceff3c62b2f9de4781b4d601)) -- **schema:** Virtual property resolvers ([#2900](https://github.com/feathersjs/feathers/issues/2900)) ([7d03b57](https://github.com/feathersjs/feathers/commit/7d03b57ae2f633bdd4a368e0d5955011fbd6c329)) - -# [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/schema - -# [5.0.0-pre.32](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.31...v5.0.0-pre.32) (2022-10-26) - -### Bug Fixes - -- **schema:** Improve resolver performance ([#2822](https://github.com/feathersjs/feathers/issues/2822)) ([5fa900f](https://github.com/feathersjs/feathers/commit/5fa900f90d55859332c90283dddddab26ae3759c)) -- **schema:** Use the same options for resolveData hook ([#2833](https://github.com/feathersjs/feathers/issues/2833)) ([ed3b050](https://github.com/feathersjs/feathers/commit/ed3b05051db6886729d4824825ca8f00c2459af7)) - -# [5.0.0-pre.31](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.30...v5.0.0-pre.31) (2022-10-12) - -### Features - -- **cli:** Generate full client test suite and improve typed client ([#2788](https://github.com/feathersjs/feathers/issues/2788)) ([57119b6](https://github.com/feathersjs/feathers/commit/57119b6bb2797f7297cf054268a248c093ecd538)) -- **cli:** Improve generated schema definitions ([#2783](https://github.com/feathersjs/feathers/issues/2783)) ([474a9fd](https://github.com/feathersjs/feathers/commit/474a9fda2107e9bcf357746320a8e00cda8182b6)) - -# [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)) -- **schema:** Make schemas validation library independent and add TypeBox support ([#2772](https://github.com/feathersjs/feathers/issues/2772)) ([44172d9](https://github.com/feathersjs/feathers/commit/44172d99b566d11d9ceda04f1d0bf72b6d05ce76)) - -# [5.0.0-pre.29](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.28...v5.0.0-pre.29) (2022-09-16) - -### Bug Fixes - -- **schema:** Fix for Ajv global collision bug [#2681](https://github.com/feathersjs/feathers/issues/2681) ([#2702](https://github.com/feathersjs/feathers/issues/2702)) ([0b2def6](https://github.com/feathersjs/feathers/commit/0b2def6ca483fad6ca22fcc4ea9873bc027925d8)) - -### Features - -- **authentication-oauth:** Koa and transport independent oAuth authentication ([#2737](https://github.com/feathersjs/feathers/issues/2737)) ([9231525](https://github.com/feathersjs/feathers/commit/9231525a24bb790ba9c5d940f2867a9c727691c9)) - -# [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) - -### Bug Fixes - -- Freeze the resolver context ([#2685](https://github.com/feathersjs/feathers/issues/2685)) ([247dccb](https://github.com/feathersjs/feathers/commit/247dccb2eb72551962030321cb1c0ecb11b0181e)) - -# [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/schema - -# [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/schema - -# [5.0.0-pre.24](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.23...v5.0.0-pre.24) (2022-06-21) - -### Bug Fixes - -- **schema:** Fix dispatch resovler hook to convert actually resolved data ([#2663](https://github.com/feathersjs/feathers/issues/2663)) ([f7e87db](https://github.com/feathersjs/feathers/commit/f7e87dbb9a0bc8d89aee47318dddbaa4d6ba5b91)) - -### Features - -- **cli:** Add typed client to a generated app ([#2669](https://github.com/feathersjs/feathers/issues/2669)) ([5b801b5](https://github.com/feathersjs/feathers/commit/5b801b5017ddc3eaa95622b539f51d605916bc86)) - -# [5.0.0-pre.23](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.22...v5.0.0-pre.23) (2022-06-06) - -### Bug Fixes - -- **schema:** Always resolve dispatch in resolveAll and add getDispatch method ([#2645](https://github.com/feathersjs/feathers/issues/2645)) ([145b366](https://github.com/feathersjs/feathers/commit/145b366435695438fbc8db9fdb161162ca9049ad)) -- **schema:** remove `default` from queryProperty schemas ([#2646](https://github.com/feathersjs/feathers/issues/2646)) ([940a2b6](https://github.com/feathersjs/feathers/commit/940a2b6868d2f77f81edb1661f6417ec2ea6e372)) - -### Features - -- **core:** Rename async hooks to around hooks, allow usual registration format ([#2652](https://github.com/feathersjs/feathers/issues/2652)) ([2a485a0](https://github.com/feathersjs/feathers/commit/2a485a07929184261f27437fc0fdfe5a44694834)) - -# [5.0.0-pre.22](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.21...v5.0.0-pre.22) (2022-05-24) - -### Bug Fixes - -- **schema:** Allows resolveData with different resolvers based on method ([#2644](https://github.com/feathersjs/feathers/issues/2644)) ([be71fa2](https://github.com/feathersjs/feathers/commit/be71fa2fe260e05b7dcc0d5f439e33f2e9ec2434)) - -# [5.0.0-pre.21](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.20...v5.0.0-pre.21) (2022-05-23) - -### Bug Fixes - -- **schema:** Add Combine helper to allow merging schema types that use ([#2637](https://github.com/feathersjs/feathers/issues/2637)) ([06d03e9](https://github.com/feathersjs/feathers/commit/06d03e91abb1347576c2351c12322d01c58473e5)) -- **typescript:** Make additional types generic to work with extended types ([#2625](https://github.com/feathersjs/feathers/issues/2625)) ([269fdec](https://github.com/feathersjs/feathers/commit/269fdecc5961092dc8608b3cbe16f433c80bfa96)) - -### Features - -- **schema:** Add resolveAll hook ([#2643](https://github.com/feathersjs/feathers/issues/2643)) ([85527d7](https://github.com/feathersjs/feathers/commit/85527d71cb78852880696e5d96abdcdf24593934)) -- **schema:** Add resolver for safe external data dispatching ([#2641](https://github.com/feathersjs/feathers/issues/2641)) ([72b980e](https://github.com/feathersjs/feathers/commit/72b980e05631136d30c8f1468dee45ec6a8d2503)) -- **schema:** Add schema resolver converter functionality ([#2640](https://github.com/feathersjs/feathers/issues/2640)) ([26d9e05](https://github.com/feathersjs/feathers/commit/26d9e05327d6e0144466cd57d6fcc11ac7ecb06a)) - -# [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)) - -### Features - -- **schema:** Add querySyntax helper to create full query schemas ([#2621](https://github.com/feathersjs/feathers/issues/2621)) ([2bbb103](https://github.com/feathersjs/feathers/commit/2bbb103b2f3e30fb0fff935f92ad3276a1a67e41)) - -# [5.0.0-pre.19](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.18...v5.0.0-pre.19) (2022-05-01) - -### Features - -- **schema:** Allow hooks to run resolvers in sequence ([#2609](https://github.com/feathersjs/feathers/issues/2609)) ([d85c507](https://github.com/feathersjs/feathers/commit/d85c507c76d07e48fc8e7e28ff7de0ef435e0ef8)) -- **typescript:** Improve adapter typings ([#2605](https://github.com/feathersjs/feathers/issues/2605)) ([3b2ca0a](https://github.com/feathersjs/feathers/commit/3b2ca0a6a8e03e8390272c4d7e930b4bffdaacf5)) -- **typescript:** Improve params and query typeability ([#2600](https://github.com/feathersjs/feathers/issues/2600)) ([df28b76](https://github.com/feathersjs/feathers/commit/df28b7619161f1df5e700326f52cca1a92dc5d28)) - -# [5.0.0-pre.18](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.17...v5.0.0-pre.18) (2022-04-11) - -### Bug Fixes - -- **schema:** result resolver correctly resolves paginated find result ([#2594](https://github.com/feathersjs/feathers/issues/2594)) ([6511e45](https://github.com/feathersjs/feathers/commit/6511e45bd0624f1a629530719709f4b27fecbe0b)) - -### Features - -- **configuration:** Allow app configuration to be validated against a schema ([#2590](https://github.com/feathersjs/feathers/issues/2590)) ([a268f86](https://github.com/feathersjs/feathers/commit/a268f86da92a8ada14ed11ab456aac0a4bba5bb0)) - -# [5.0.0-pre.17](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.16...v5.0.0-pre.17) (2022-02-15) - -### Bug Fixes - -- **hooks:** Allow all built-in hooks to be used the async and regular way ([#2559](https://github.com/feathersjs/feathers/issues/2559)) ([8f9f631](https://github.com/feathersjs/feathers/commit/8f9f631e0ce89de349207db72def84e7ab496a4a)) -- **queryProperty:** allow compound oneOf ([#2545](https://github.com/feathersjs/feathers/issues/2545)) ([3077d2d](https://github.com/feathersjs/feathers/commit/3077d2d896a38d579ce4d5b530e21ad332bcf221)) -- **schema:** Properly handle resolver errors ([#2540](https://github.com/feathersjs/feathers/issues/2540)) ([31fbdff](https://github.com/feathersjs/feathers/commit/31fbdff8bd848ac7e0eda56e307ac34b1bfcf17f)) - -# [5.0.0-pre.16](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.15...v5.0.0-pre.16) (2022-01-12) - -### Bug Fixes - -- **schema:** Do not error for schemas without properties ([#2519](https://github.com/feathersjs/feathers/issues/2519)) ([96fdb47](https://github.com/feathersjs/feathers/commit/96fdb47d45fd88a8039aa9cc9ec8aebd98672b95)) -- **schema:** Fix resolver data type and use new validation feature in test fixture ([#2523](https://github.com/feathersjs/feathers/issues/2523)) ([1093f12](https://github.com/feathersjs/feathers/commit/1093f124b60524cbd9050fcf07ddaf1d558973da)) - -### Features - -- **schema:** Allow to use custom AJV and test with ajv-formats ([#2513](https://github.com/feathersjs/feathers/issues/2513)) ([ecfa4df](https://github.com/feathersjs/feathers/commit/ecfa4df29f029f6ca8517cacf518c14b46ffeb4e)) -- **schema:** Improve schema typing, validation and extensibility ([#2521](https://github.com/feathersjs/feathers/issues/2521)) ([8c1b350](https://github.com/feathersjs/feathers/commit/8c1b35052792e82d13be03c06583534284fbae82)) - -# [5.0.0-pre.15](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.14...v5.0.0-pre.15) (2021-11-27) - -### Bug Fixes - -- **typescript:** Overall typing improvements ([#2478](https://github.com/feathersjs/feathers/issues/2478)) ([b8eb804](https://github.com/feathersjs/feathers/commit/b8eb804158556d9651a8607e3c3fda15e0bfd110)) - -# [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/schema - -# [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/schema - -# [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/schema - -# [5.0.0-pre.11](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.10...v5.0.0-pre.11) (2021-10-06) - -### Features - -- **schema:** Allow resolvers to validate a schema ([#2465](https://github.com/feathersjs/feathers/issues/2465)) ([7d9590b](https://github.com/feathersjs/feathers/commit/7d9590bbe12b94b8b5a7987684f5d4968e426481)) - -# [5.0.0-pre.10](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.9...v5.0.0-pre.10) (2021-09-19) - -### Features - -- **schema:** Initial version of schema definitions and resolvers ([#2441](https://github.com/feathersjs/feathers/issues/2441)) ([c57a5cd](https://github.com/feathersjs/feathers/commit/c57a5cd56699a121647be4506d8f967e6d72ecae)) diff --git a/packages/schema/LICENSE b/packages/schema/LICENSE deleted file mode 100644 index 7712f870f3..0000000000 --- a/packages/schema/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2024 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 -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -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 deleted file mode 100644 index 8a893572ef..0000000000 --- a/packages/schema/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# @feathersjs/schema - -[![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/schema.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/schema) -[![Discord](https://badgen.net/badge/icon/discord?icon=discord&label)](https://discord.gg/qa8kez8QBx) - -> A common data schema definition format - -## Installation - -``` -npm install @feathersjs/schema --save -``` - -## Documentation - -Refer to the [Feathers schema API documentation](https://feathersjs.com/api/schema/) 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/schema/package.json b/packages/schema/package.json deleted file mode 100644 index ab290b0729..0000000000 --- a/packages/schema/package.json +++ /dev/null @@ -1,80 +0,0 @@ -{ - "name": "@feathersjs/schema", - "description": "A common data schema definition format", - "version": "5.0.34", - "homepage": "https://feathersjs.com", - "main": "lib/", - "types": "lib/", - "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", - "directory": "packages/schema" - }, - "author": { - "name": "Feathers contributors", - "email": "hello@feathersjs.com", - "url": "https://feathersjs.com" - }, - "contributors": [], - "bugs": { - "url": "https://github.com/feathersjs/feathers/issues" - }, - "engines": { - "node": ">= 12" - }, - "files": [ - "CHANGELOG.md", - "LICENSE", - "README.md", - "src/**", - "lib/**", - "*.d.ts", - "*.js" - ], - "scripts": { - "prepublish": "npm run compile", - "pack": "npm pack --pack-destination ../generators/test/build", - "compile": "shx rm -rf lib/ && tsc && npm run pack", - "mocha": "mocha --config ../../.mocharc.json --recursive test/**.test.ts test/**/*.test.ts", - "test": "npm run compile && npm run mocha" - }, - "directories": { - "lib": "lib" - }, - "publishConfig": { - "access": "public" - }, - "dependencies": { - "@feathersjs/adapter-commons": "^5.0.34", - "@feathersjs/commons": "^5.0.34", - "@feathersjs/errors": "^5.0.34", - "@feathersjs/feathers": "^5.0.34", - "@feathersjs/hooks": "^0.9.0", - "@types/json-schema": "^7.0.15", - "ajv": "^8.17.1", - "ajv-formats": "^3.0.1", - "json-schema-to-ts": "^3.1.1" - }, - "devDependencies": { - "@feathersjs/memory": "^5.0.34", - "@types/mocha": "^10.0.10", - "@types/node": "^24.1.0", - "ajv-formats": "^3.0.1", - "mocha": "^11.7.1", - "shx": "^0.4.0", - "typescript": "^5.9.2" - }, - "peerDependencies": { - "typescript": ">=5.8" - }, - "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" -} diff --git a/packages/schema/src/default-schemas.ts b/packages/schema/src/default-schemas.ts deleted file mode 100644 index 810af0677a..0000000000 --- a/packages/schema/src/default-schemas.ts +++ /dev/null @@ -1,178 +0,0 @@ -import { FromSchema } from 'json-schema-to-ts' - -export const authenticationSettingsSchema = { - type: 'object', - required: ['secret', 'entity', 'authStrategies'], - properties: { - secret: { - type: 'string', - description: 'The JWT signing secret' - }, - entity: { - oneOf: [ - { - type: 'null' - }, - { - type: 'string' - } - ], - description: 'The name of the authentication entity (e.g. user)' - }, - entityId: { - type: 'string', - description: 'The name of the authentication entity id property' - }, - service: { - type: 'string', - description: 'The path of the entity service' - }, - authStrategies: { - type: 'array', - items: { type: 'string' }, - description: 'A list of authentication strategy names that are allowed to create JWT access tokens' - }, - parseStrategies: { - type: 'array', - items: { type: 'string' }, - description: - 'A list of authentication strategy names that should parse HTTP headers for authentication information (defaults to `authStrategies`)' - }, - jwtOptions: { - type: 'object' - }, - jwt: { - type: 'object', - properties: { - header: { - type: 'string', - default: 'Authorization', - description: 'The HTTP header containing the JWT' - }, - schemes: { - type: 'array', - items: { type: 'string' }, - description: 'An array of schemes to support' - } - } - }, - local: { - type: 'object', - required: ['usernameField', 'passwordField'], - properties: { - usernameField: { - type: 'string', - description: 'Name of the username field (e.g. `email`)' - }, - passwordField: { - type: 'string', - description: 'Name of the password field (e.g. `password`)' - }, - hashSize: { - type: 'number', - description: 'The BCrypt salt length' - }, - errorMessage: { - type: 'string', - default: 'Invalid login', - description: 'The error message to return on errors' - }, - entityUsernameField: { - type: 'string', - description: - 'Name of the username field on the entity if authentication request data and entity field names are different' - }, - entityPasswordField: { - type: 'string', - description: - 'Name of the password field on the entity if authentication request data and entity field names are different' - } - } - }, - oauth: { - type: 'object', - properties: { - redirect: { - type: 'string' - }, - origins: { - type: 'array', - items: { type: 'string' } - }, - defaults: { - type: 'object', - properties: { - key: { type: 'string' }, - secret: { type: 'string' } - } - } - } - } - } -} as const - -export type AuthenticationConfiguration = FromSchema - -export const sqlSettingsSchema = { - type: 'object', - properties: { - client: { type: 'string' }, - pool: { - type: 'object', - properties: { - min: { type: 'number' }, - max: { type: 'number' } - } - }, - connection: { - oneOf: [ - { type: 'string' }, - { - type: 'object', - properties: { - host: { type: 'string' }, - port: { type: 'number' }, - user: { type: 'string' }, - password: { type: 'string' }, - database: { type: 'string' } - } - } - ] - } - } -} as const - -/** - * Schema for properties that are available in a standard Feathers application. - */ -export const defaultAppSettings = { - authentication: authenticationSettingsSchema, - origins: { - type: 'array', - items: { - type: 'string' - } - }, - paginate: { - type: 'object', - additionalProperties: false, - required: ['default', 'max'], - properties: { - default: { type: 'number' }, - max: { type: 'number' } - } - }, - mongodb: { type: 'string' }, - mysql: sqlSettingsSchema, - postgresql: sqlSettingsSchema, - sqlite: sqlSettingsSchema, - mssql: sqlSettingsSchema -} as const - -export const defaultAppConfiguration = { - type: 'object', - additionalProperties: false, - properties: defaultAppSettings -} as const - -export type DefaultAppConfiguration = FromSchema diff --git a/packages/schema/src/hooks/index.ts b/packages/schema/src/hooks/index.ts deleted file mode 100644 index 935ab76328..0000000000 --- a/packages/schema/src/hooks/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './resolve' -export * from './validate' diff --git a/packages/schema/src/hooks/resolve.ts b/packages/schema/src/hooks/resolve.ts deleted file mode 100644 index b61bbcb110..0000000000 --- a/packages/schema/src/hooks/resolve.ts +++ /dev/null @@ -1,242 +0,0 @@ -import { HookContext, NextFunction } from '@feathersjs/feathers' -import { compose } from '@feathersjs/hooks' -import { Resolver, ResolverStatus } from '../resolver' - -const getResult = (context: H) => { - const isPaginated = context.method === 'find' && context.result.data - const data = isPaginated ? context.result.data : context.result - - return { isPaginated, data } -} - -const runResolvers = async ( - resolvers: Resolver[], - data: any, - ctx: H, - status?: Partial> -) => { - let current: any = data - - for (const resolver of resolvers) { - if (resolver && typeof resolver.resolve === 'function') { - current = await resolver.resolve(current, ctx, status) - } - } - - return current as T -} - -export type ResolverSetting = Resolver | Resolver[] - -export const resolveQuery = - (...resolvers: Resolver[]) => - async (context: H, next?: NextFunction) => { - const data = context?.params?.query || {} - const query = await runResolvers(resolvers, data, context) - - context.params = { - ...context.params, - query - } - - if (typeof next === 'function') { - return next() - } - } - -export const resolveData = - (...resolvers: Resolver[]) => - async (context: H, next?: NextFunction) => { - if (context.data !== undefined) { - const data = context.data - - const status = { - originalContext: context - } - - if (Array.isArray(data)) { - context.data = await Promise.all( - data.map((current) => runResolvers(resolvers, current, context, status)) - ) - } else { - context.data = await runResolvers(resolvers, data, context, status) - } - } - - if (typeof next === 'function') { - return next() - } - } - -export const resolveResult = (...resolvers: Resolver[]) => { - const virtualProperties = new Set(resolvers.reduce((acc, current) => acc.concat(current.virtualNames), [])) - - return async (context: H, next: NextFunction) => { - if (typeof next !== 'function') { - throw new Error('The resolveResult hook must be used as an around hook') - } - - const { $resolve, $select, ...query } = context.params?.query || {} - const hasVirtualSelects = Array.isArray($select) && $select.some((name) => virtualProperties.has(name)) - - const resolve = { - originalContext: context, - ...context.params.resolve, - properties: $resolve || $select - } - - context.params = { - ...context.params, - resolve, - query: { - ...query, - ...(!!$select && !hasVirtualSelects ? { $select } : {}) - } - } - - await next() - - const status = context.params.resolve - const { isPaginated, data } = getResult(context) - - const result = Array.isArray(data) - ? await Promise.all(data.map(async (current) => runResolvers(resolvers, current, context, status))) - : await runResolvers(resolvers, data, context, status) - - if (isPaginated) { - context.result.data = result - } else { - context.result = result - } - } -} - -export const DISPATCH = Symbol.for('@feathersjs/schema/dispatch') - -export const getDispatchValue = (value: any): any => { - if (typeof value === 'object' && value !== null) { - if (value[DISPATCH] !== undefined) { - return value[DISPATCH] - } - - if (Array.isArray(value)) { - return value.map((item) => getDispatchValue(item)) - } - } - - return value -} - -export const getDispatch = (value: any): any => - typeof value === 'object' && value !== null && value[DISPATCH] ? value[DISPATCH] : null - -export const setDispatch = (current: any, dispatch: any) => { - Object.defineProperty(current, DISPATCH, { - value: dispatch, - enumerable: false, - configurable: false - }) - - return dispatch -} - -export const resolveExternal = - (...resolvers: Resolver[]) => - async (context: H, next: NextFunction) => { - if (typeof next !== 'function') { - throw new Error('The resolveExternal hook must be used as an around hook') - } - - await next() - - const existingDispatch = getDispatch(context.result) - - if (existingDispatch !== null) { - context.dispatch = existingDispatch - } else { - const status = context.params.resolve - const { isPaginated, data } = getResult(context) - const resolveAndGetDispatch = async (current: any) => { - const currentExistingDispatch = getDispatch(current) - - if (currentExistingDispatch !== null) { - return currentExistingDispatch - } - - const resolved = await runResolvers(resolvers, current, context, status) - const currentDispatch = Object.keys(resolved).reduce( - (res, key) => { - res[key] = getDispatchValue(resolved[key]) - - return res - }, - {} as Record - ) - - return setDispatch(current, currentDispatch) - } - - const result = await (Array.isArray(data) - ? Promise.all(data.map(resolveAndGetDispatch)) - : resolveAndGetDispatch(data)) - const dispatch = isPaginated - ? { - ...context.result, - data: result - } - : result - - context.dispatch = setDispatch(context.result, dispatch) - } - } - -export const resolveDispatch = resolveExternal - -type ResolveAllSettings = { - data?: { - create: Resolver - patch: Resolver - update: Resolver - } - query?: Resolver - result?: Resolver - dispatch?: Resolver -} - -const dataMethods = ['create', 'update', 'patch'] as const - -/** - * Resolve all resolvers at once. - * - * @param map The individual resolvers - * @returns A combined resolver middleware - * @deprecated Use individual data, query and external resolvers and hooks instead. - * @see https://dove.feathersjs.com/guides/cli/service.schemas.html - */ -export const resolveAll = (map: ResolveAllSettings) => { - const middleware = [] - - middleware.push(resolveDispatch(map.dispatch)) - - if (map.result) { - middleware.push(resolveResult(map.result)) - } - - if (map.query) { - middleware.push(resolveQuery(map.query)) - } - - if (map.data) { - dataMethods.forEach((name) => { - if (map.data[name]) { - const resolver = resolveData(map.data[name]) - - middleware.push(async (context: H, next: NextFunction) => - context.method === name ? resolver(context, next) : next() - ) - } - }) - } - - return compose(middleware) -} diff --git a/packages/schema/src/hooks/validate.ts b/packages/schema/src/hooks/validate.ts deleted file mode 100644 index 37bcfb0a60..0000000000 --- a/packages/schema/src/hooks/validate.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { 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' - -export const validateQuery = (schema: Schema | Validator) => { - const validator: Validator = typeof schema === 'function' ? schema : schema.validate.bind(schema) - - return async (context: H, next?: NextFunction) => { - const data = context?.params?.query || {} - - try { - const query = await validator(data) - - Object.defineProperty(query, VALIDATED, { value: true }) - - context.params = { - ...context.params, - query - } - } catch (error: any) { - throw error.ajv ? new BadRequest(error.message, error.errors) : error - } - - if (typeof next === 'function') { - return next() - } - } -} - -export const validateData = (schema: Schema | DataValidatorMap | Validator) => { - return async (context: H, next?: NextFunction) => { - const data = context.data - const validator = - typeof (schema as Schema).validate === 'function' - ? (schema as Schema).validate.bind(schema) - : typeof schema === 'function' - ? schema - : (schema as any)[context.method] - - if (validator) { - try { - if (Array.isArray(data)) { - context.data = await Promise.all(data.map((current) => validator(current))) - } else { - context.data = await validator(data) - } - - Object.defineProperty(context.data, VALIDATED, { value: true }) - } catch (error: any) { - throw error.ajv ? new BadRequest(error.message, error.errors) : error - } - } - - if (typeof next === 'function') { - return next() - } - } -} diff --git a/packages/schema/src/index.ts b/packages/schema/src/index.ts deleted file mode 100644 index 6e5e2ba8fa..0000000000 --- a/packages/schema/src/index.ts +++ /dev/null @@ -1,24 +0,0 @@ -import addFormats, { FormatName, FormatOptions, FormatsPluginOptions } from 'ajv-formats' -import { ResolverStatus } from './resolver' - -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 * as hooks from './hooks' -export * as jsonSchema from './json-schema' - -export type Infer = S['_type'] - -export type Combine = Pick, Exclude, keyof U>> & U - -declare module '@feathersjs/feathers/lib/declarations' { - interface Params { - resolve?: ResolverStatus - } -} diff --git a/packages/schema/src/json-schema.ts b/packages/schema/src/json-schema.ts deleted file mode 100644 index 0d0739b49b..0000000000 --- a/packages/schema/src/json-schema.ts +++ /dev/null @@ -1,244 +0,0 @@ -import { _ } from '@feathersjs/commons' -import { JSONSchema } from 'json-schema-to-ts' -import { JSONSchemaDefinition, Ajv, Validator } from './schema' - -export type DataSchemaMap = { - create: JSONSchemaDefinition - update?: JSONSchemaDefinition - patch?: JSONSchemaDefinition -} - -export type DataValidatorMap = { - create: Validator - update: Validator - patch: Validator -} - -/** - * Returns a compiled validation function for a schema and AJV validator instance. - * - * @param schema The JSON schema definition - * @param validator The AJV validation instance - * @returns A compiled validation function - */ -export const getValidator = (schema: JSONSchemaDefinition, validator: Ajv): Validator => - validator.compile({ - $async: true, - ...(schema as any) - }) as any as Validator - -/** - * Returns compiled validation functions to validate data for the `create`, `update` and `patch` - * service methods. If not passed explicitly, the `update` validator will be the same as the `create` - * and `patch` will be the `create` validator with no required fields. - * - * @param def Either general JSON schema definition or a mapping of `create`, `update` and `patch` - * to their respecitve JSON schema - * @param validator The Ajv instance to use as the validator - * @returns A map of validator functions - */ -export const getDataValidator = ( - def: JSONSchemaDefinition | DataSchemaMap, - validator: Ajv -): DataValidatorMap => { - const schema = ((def as any).create ? def : { create: def }) as DataSchemaMap - - return { - create: getValidator(schema.create, validator), - update: getValidator( - schema.update || { - ...(schema.create as any), - $id: `${schema.create.$id}Update` - }, - validator - ), - patch: getValidator( - schema.patch || { - ...(schema.create as any), - $id: `${schema.create.$id}Patch`, - required: [] - }, - validator - ) - } -} - -export type PropertyQuery = { - anyOf: [ - D, - { - type: 'object' - additionalProperties: false - properties: { - $gt: D - $gte: D - $lt: D - $lte: D - $ne: D - $in: { - type: 'array' - items: D - } - $nin: { - type: 'array' - items: D - } - } & X - } - ] -} - -/** - * Create a Feathers query syntax compatible JSON schema definition for a property definition. - * - * @param def The property definition (e.g. `{ type: 'string' }`) - * @param extensions Additional properties to add to the query property schema - * @returns A JSON schema definition for the Feathers query syntax for this property. - */ -export const queryProperty = ( - def: T, - extensions: X = {} as X -) => { - const definition = _.omit(def, 'default') - return { - anyOf: [ - definition, - { - type: 'object', - additionalProperties: false, - properties: { - $gt: definition, - $gte: definition, - $lt: definition, - $lte: definition, - $ne: definition, - $in: - definition.type === 'array' - ? definition - : { - type: 'array', - items: definition - }, - $nin: - definition.type === 'array' - ? definition - : { - type: 'array', - items: definition - }, - ...extensions - } - } - ] - } as const -} - -/** - * Creates Feathers a query syntax compatible JSON schema for multiple properties. - * - * @param definitions A map of property definitions - * @param extensions Additional properties to add to the query property schema - * @returns The JSON schema definition for the Feathers query syntax for multiple properties - */ -export const queryProperties = < - T extends { [key: string]: JSONSchema }, - X extends { [K in keyof T]?: { [key: string]: JSONSchema } } ->( - definitions: T, - extensions: X = {} as X -) => - Object.keys(definitions).reduce( - (res, key) => { - const result = res as any - const definition = definitions[key] - - result[key] = queryProperty(definition as JSONSchemaDefinition, extensions[key as keyof T]) - - return result - }, - {} as { [K in keyof T]: PropertyQuery } - ) - -/** - * Creates a JSON schema for the complete Feathers query syntax including `$limit`, $skip` - * and `$sort` and `$select` for the allowed properties. - * - * @param definition The property definitions to create the query syntax schema for - * @param extensions Additional properties to add to the query property schema - * @returns A JSON schema for the complete query syntax - */ -export const querySyntax = < - T extends { [key: string]: JSONSchema }, - X extends { [K in keyof T]?: { [key: string]: JSONSchema } } ->( - definition: T, - extensions: X = {} as X -) => { - const keys = Object.keys(definition) - const props = queryProperties(definition, extensions) - const $or = { - type: 'array', - items: { - type: 'object', - additionalProperties: false, - properties: props - } - } as const - const $and = { - type: 'array', - items: { - type: 'object', - additionalProperties: false, - properties: { - ...props, - $or - } - } - } as const - - return { - $limit: { - type: 'number', - minimum: 0 - }, - $skip: { - type: 'number', - minimum: 0 - }, - $sort: { - type: 'object', - properties: keys.reduce( - (res, key) => { - const result = res as any - - result[key] = { - type: 'number', - enum: [1, -1] - } - - return result - }, - {} as { [K in keyof T]: { readonly type: 'number'; readonly enum: [1, -1] } } - ) - }, - $select: { - type: 'array', - maxItems: keys.length, - items: { - type: 'string', - ...(keys.length > 0 ? { enum: keys as any as (keyof T)[] } : {}) - } - }, - $or, - $and, - ...props - } as const -} - -export const ObjectIdSchema = () => - ({ - anyOf: [ - { type: 'string', objectid: true }, - { type: 'object', properties: {}, additionalProperties: true } - ] - }) as const diff --git a/packages/schema/src/resolver.ts b/packages/schema/src/resolver.ts deleted file mode 100644 index 4c191ca79d..0000000000 --- a/packages/schema/src/resolver.ts +++ /dev/null @@ -1,203 +0,0 @@ -import { BadRequest } from '@feathersjs/errors' -import { Schema } from './schema' - -type PromiseOrLiteral = Promise | V - -export type PropertyResolver = (( - value: V | undefined, - obj: T, - context: C, - status: ResolverStatus -) => PromiseOrLiteral) & { [IS_VIRTUAL]?: boolean } - -export type VirtualResolver = ( - obj: T, - context: C, - status: ResolverStatus -) => PromiseOrLiteral - -export const IS_VIRTUAL = Symbol.for('@feathersjs/schema/virtual') - -/** - * Create a resolver for a virtual property. A virtual property is a property that - * is computed and never has an initial value. - * - * @param virtualResolver The virtual resolver function - * @returns The property resolver function - */ -export const virtual = (virtualResolver: VirtualResolver) => { - const propertyResolver: PropertyResolver = async (_value, obj, context, status) => - virtualResolver(obj, context, status) - - propertyResolver[IS_VIRTUAL] = true - - return propertyResolver -} - -export type PropertyResolverMap = { - [key in keyof T]?: PropertyResolver | ReturnType> -} - -export type ResolverConverter = ( - obj: any, - context: C, - status: ResolverStatus -) => PromiseOrLiteral - -export interface ResolverOptions { - schema?: Schema - /** - * A converter function that is run before property resolvers - * to transform the initial data into a different format. - */ - converter?: ResolverConverter -} - -export interface ResolverConfig extends ResolverOptions { - /** - * @deprecated Use the `validateData` and `validateQuery` hooks explicitly instead - */ - validate?: 'before' | 'after' | false - /** - * The properties to resolve - */ - properties: PropertyResolverMap -} - -export interface ResolverStatus { - path: string[] - originalContext?: C - properties?: (keyof T)[] - stack: PropertyResolver[] -} - -export class Resolver { - readonly _type!: T - public propertyNames: (keyof T)[] - public virtualNames: (keyof T)[] - - constructor(public readonly options: ResolverConfig) { - this.propertyNames = Object.keys(options.properties) as any as (keyof T)[] - this.virtualNames = this.propertyNames.filter((name) => options.properties[name][IS_VIRTUAL]) - } - - /** - * Resolve a single property - * - * @param name The name of the property - * @param data The current data - * @param context The current resolver context - * @param status The current resolver status - * @returns The resolver property - */ - async resolveProperty( - name: K, - data: D, - context: C, - status: Partial> = {} - ): Promise { - const resolver = this.options.properties[name] - const value = (data as any)[name] - const { path = [], stack = [] } = status || {} - - // This prevents circular dependencies - if (stack.includes(resolver)) { - return undefined - } - - const resolverStatus = { - ...status, - path: [...path, name as string], - stack: [...stack, resolver] - } - - return resolver(value, data as any, context, resolverStatus) - } - - async convert(data: D, context: C, status?: Partial>) { - if (this.options.converter) { - const { path = [], stack = [] } = status || {} - - return this.options.converter(data, context, { ...status, path, stack }) - } - - return data - } - - async resolve(_data: D, context: C, status?: Partial>): Promise { - const { properties: resolvers, schema, validate } = this.options - const payload = await this.convert(_data, context, status) - - if (!Array.isArray(status?.properties) && this.propertyNames.length === 0) { - return payload as T - } - - const data = schema && validate === 'before' ? await schema.validate(payload) : payload - const propertyList = ( - Array.isArray(status?.properties) - ? status?.properties - : // By default get all data and resolver keys but remove duplicates - [...new Set(Object.keys(data).concat(this.propertyNames as string[]))] - ) as (keyof T)[] - - const result: any = {} - const errors: any = {} - let hasErrors = false - - // Not the most elegant but better performance - await Promise.all( - propertyList.map(async (name) => { - const value = (data as any)[name] - - if (resolvers[name]) { - try { - const resolved = await this.resolveProperty(name, data, context, status) - - if (resolved !== undefined) { - result[name] = resolved - } - } catch (error: any) { - // TODO add error stacks - const convertedError = - typeof error.toJSON === 'function' ? error.toJSON() : { message: error.message || error } - - errors[name] = convertedError - hasErrors = true - } - } else if (value !== undefined) { - result[name] = value - } - }) - ) - - if (hasErrors) { - const propertyName = status?.properties ? ` ${status.properties.join('.')}` : '' - - throw new BadRequest('Error resolving data' + (propertyName ? ` ${propertyName}` : ''), errors) - } - - return schema && validate === 'after' ? await schema.validate(result) : result - } -} - -/** - * Create a new resolver with ``. - * - * @param options The configuration for the returned resolver - * @returns A new resolver instance - */ -export function resolve( - properties: PropertyResolverMap, - options?: ResolverOptions -): Resolver -export function resolve(options: ResolverConfig): Resolver -export function resolve( - properties: PropertyResolverMap | ResolverConfig, - options?: ResolverOptions -) { - const settings = ( - (properties as ResolverConfig).properties ? properties : { properties, ...options } - ) as ResolverConfig - - return new Resolver(settings) -} diff --git a/packages/schema/src/schema.ts b/packages/schema/src/schema.ts deleted file mode 100644 index d59396f566..0000000000 --- a/packages/schema/src/schema.ts +++ /dev/null @@ -1,70 +0,0 @@ -import Ajv, { AsyncValidateFunction, ValidateFunction } from 'ajv' -import { FromSchema, JSONSchema } from 'json-schema-to-ts' -import { BadRequest } from '@feathersjs/errors' - -export const DEFAULT_AJV = new Ajv({ - coerceTypes: true, - addUsedSchema: false -}) - -export { Ajv } - -/** - * A validation function that takes data and returns the (possibly coerced) - * data or throws a validation error. - */ -export type Validator = (data: T) => Promise - -export type JSONSchemaDefinition = JSONSchema & { - $id: string - $async?: true - properties?: { [key: string]: JSONSchema } - required?: readonly string[] -} - -export interface Schema { - validate(...args: Parameters>): Promise -} - -export class SchemaWrapper implements Schema> { - ajv: Ajv - validator: AsyncValidateFunction - readonly _type!: FromSchema - - constructor( - public definition: S, - ajv: Ajv = DEFAULT_AJV - ) { - this.ajv = ajv - this.validator = this.ajv.compile({ - $async: true, - ...(this.definition as any) - }) as AsyncValidateFunction - } - - get properties() { - return this.definition.properties as S['properties'] - } - - get required() { - return this.definition.required as S['required'] - } - - async validate>(...args: Parameters>) { - try { - const validated = (await this.validator(...args)) as T - - return validated - } catch (error: any) { - throw new BadRequest(error.message, error.errors) - } - } - - toJSON() { - return this.definition - } -} - -export function schema(definition: S, ajv: Ajv = DEFAULT_AJV) { - return new SchemaWrapper(definition, ajv) -} diff --git a/packages/schema/test/fixture.ts b/packages/schema/test/fixture.ts deleted file mode 100644 index 4456d6aad5..0000000000 --- a/packages/schema/test/fixture.ts +++ /dev/null @@ -1,285 +0,0 @@ -import { feathers, HookContext, Application as FeathersApplication } from '@feathersjs/feathers' -import { memory, MemoryService } from '@feathersjs/memory' -import { GeneralError } from '@feathersjs/errors' -import { AdapterParams } from '@feathersjs/adapter-commons' - -import { - resolve, - resolveResult, - resolveQuery, - resolveData, - validateData, - validateQuery, - querySyntax, - resolveDispatch, - resolveAll, - Ajv, - FromSchema, - getValidator, - getDataValidator, - virtual, - resolveExternal -} from '../src' - -const fixtureAjv = new Ajv({ - coerceTypes: true, - addUsedSchema: false -}) - -export const userDataSchema = { - $id: 'UserData', - type: 'object', - additionalProperties: false, - required: ['email'], - properties: { - email: { type: 'string' }, - password: { type: 'string' } - } -} as const - -export const userDataValidator = getValidator(userDataSchema, fixtureAjv) - -export const userDataValidatorMap = getDataValidator(userDataSchema, fixtureAjv) - -export type UserData = FromSchema - -export const userDataResolver = resolve>({ - properties: { - password: async () => { - return 'hashed' - } - } -}) - -export const userSchema = { - $id: 'User', - type: 'object', - additionalProperties: false, - required: ['id', ...userDataSchema.required], - properties: { - ...userDataSchema.properties, - id: { type: 'number' }, - name: { type: 'string' } - } -} as const - -export type User = FromSchema - -export const userResolver = resolve>({ - name: async (_value, user) => user.email.split('@')[0] -}) - -export const userExternalResolver = resolve>({ - properties: { - password: async (): Promise => undefined, - email: async () => '[redacted]' - } -}) - -export const secondUserResolver = resolve>({ - name: async (value, user) => `${value} (${user.email})` -}) - -export const messageDataSchema = { - $id: 'MessageData', - type: 'object', - additionalProperties: false, - required: ['text', 'userId'], - properties: { - text: { type: 'string' }, - userId: { type: 'number' } - } -} as const - -export type MessageData = FromSchema - -export const messageSchema = { - $id: 'MessageResult', - type: 'object', - additionalProperties: false, - required: ['id', ...messageDataSchema.required], - properties: { - ...messageDataSchema.properties, - id: { type: 'number' }, - user: { $ref: 'User' }, - userList: { type: 'array', items: { $ref: 'User' } }, - userPage: { type: 'object' } - } -} as const - -export type Message = FromSchema< - typeof messageSchema, - { - references: [typeof userSchema] - } -> - -export const messageResolver = resolve>({ - user: virtual(async (message, context) => { - const { userId } = message - - if (context.params.error === true) { - throw new GeneralError('This is an error') - } - - const { - data: [user] - } = (await context.app.service('users').find({ - ...context.params, - paginate: { default: 2 }, - query: { - id: userId - } - })) as any - - return user as Message['user'] - }), - userList: virtual(async (_message, context) => { - const users = await context.app.service('users').find({ - paginate: false - }) - - return users.map((user) => user) as any - }), - userPage: virtual(async (_message, context) => { - const users = await context.app.service('users').find({ - adapter: { - paginate: { - default: 2 - } - } - }) - - return users as any - }) -}) - -export const otherMessageResolver = resolve<{ text: string }, HookContext>({}) - -export const messageQuerySchema = { - $id: 'MessageQuery', - type: 'object', - additionalProperties: false, - required: [], - properties: { - ...querySyntax(messageDataSchema.properties), - $select: { - type: 'array', - items: { type: 'string' } - }, - $resolve: { - type: 'array', - items: { type: 'string' } - } - } -} as const - -export type MessageQuery = FromSchema - -export const messageQueryValidator = getValidator(messageQuerySchema, fixtureAjv) - -export const messageQueryResolver = resolve>({ - userId: async (value, _query, context) => { - if (context.params?.user) { - return context.params.user.id - } - - return value - } -}) - -interface ServiceParams extends AdapterParams { - user?: User - error?: boolean -} - -class MessageService extends MemoryService { - async customMethod(data: any) { - return data - } -} - -const findResult = { message: 'Hello' } -class CustomService { - async find() { - return [findResult] - } -} - -const customMethodDataResolver = resolve>({ - properties: { - userId: async () => 0, - additionalData: async () => 'additional data' - } -}) - -type ServiceTypes = { - users: MemoryService - messages: MessageService - paginatedMessages: MemoryService - custom: CustomService -} -type Application = FeathersApplication - -const app = feathers() - -app.use( - 'users', - memory({ - multi: ['create'] - }) -) -app.use('messages', new MessageService(), { - methods: ['find', 'get', 'create', 'update', 'patch', 'remove', 'customMethod'] -}) -app.use('custom', new CustomService()) - -app.service('custom').hooks({ - around: { - all: [resolveExternal(resolve>({}))] - } -}) - -app.use('paginatedMessages', memory({ paginate: { default: 10 } })) - -app.service('messages').hooks({ - around: { - all: [ - resolveAll({ - result: messageResolver, - query: messageQueryResolver - }), - validateQuery(messageQueryValidator) - ], - customMethod: [resolveData(customMethodDataResolver)], - find: [ - async (context, next) => { - // A hook that makes sure that virtual properties are not passed to the adapter as `$select` - // An SQL adapter would throw an error if it received a query like this - if (context.params?.query?.$select && context.params?.query?.$select.includes('user')) { - throw new Error('Invalid $select') - } - await next() - } - ] - } -}) - -app - .service('paginatedMessages') - .hooks([ - resolveDispatch(), - resolveResult(messageResolver, otherMessageResolver), - validateQuery(messageQueryValidator), - resolveQuery(messageQueryResolver) - ]) - -app - .service('users') - .hooks([resolveDispatch(userExternalResolver), resolveResult(userResolver, secondUserResolver)]) - -app.service('users').hooks({ - create: [validateData(userDataValidator), validateData(userDataValidatorMap), resolveData(userDataResolver)] -}) - -export { app } diff --git a/packages/schema/test/hooks.test.ts b/packages/schema/test/hooks.test.ts deleted file mode 100644 index b7a5b1c8a0..0000000000 --- a/packages/schema/test/hooks.test.ts +++ /dev/null @@ -1,276 +0,0 @@ -import { createContext } from '@feathersjs/feathers' -import assert from 'assert' -import { app, Message, User } from './fixture' - -describe('@feathersjs/schema/hooks', () => { - const text = 'Hi there' - let message: Message - let messageOnPaginatedService: Message - let user: User - - const userProps = (user: User) => ({ - user, - userList: [user], - userPage: { - limit: 2, - skip: 0, - total: 1, - data: [user] - } - }) - - before(async () => { - user = ( - await app.service('users').create([ - { - email: 'hello@feathersjs.com', - password: 'supersecret' - } - ]) - )[0] - message = await app.service('messages').create({ - text, - userId: user.id - }) - messageOnPaginatedService = await app.service('paginatedMessages').create({ - text, - userId: user.id - }) - }) - - it('ran resolvers in sequence', async () => { - assert.strictEqual(user.name, 'hello (hello@feathersjs.com)') - }) - - it('validates data', async () => { - assert.rejects(() => app.service('users').create({ password: 'failing' } as any), { - name: 'BadRequest' - }) - }) - - it('resolves results and handles resolver errors (#2534)', async () => { - const payload = { - userId: user.id, - text - } - - assert.ok(user) - assert.strictEqual(user.password, 'hashed', 'Resolved data') - assert.deepStrictEqual(message, { - id: 0, - ...userProps(user), - ...payload - }) - - const messages = await app.service('messages').find({ - provider: 'external' - }) - - assert.deepStrictEqual(messages, [ - { - id: 0, - ...userProps(user), - ...payload - } - ]) - - await assert.rejects( - () => - app.service('messages').find({ - provider: 'external', - error: true - }), - { - name: 'BadRequest', - message: 'Error resolving data', - code: 400, - className: 'bad-request', - data: { - user: { - name: 'GeneralError', - message: 'This is an error', - code: 500, - className: 'general-error' - } - } - } - ) - }) - - it('resolves get result with the object on result', async () => { - const payload = { - userId: user.id, - text - } - - assert.ok(user) - assert.strictEqual(user.password, 'hashed', 'Resolved data') - assert.deepStrictEqual(message, { - id: 0, - ...userProps(user), - ...payload - }) - - const result = await app.service('messages').get(0, { - provider: 'external' - }) - - assert.deepStrictEqual(result, { - id: 0, - ...userProps(user), - ...payload - }) - }) - - it('resolves with $select and virtual properties', async () => { - const messages = await app.service('messages').find({ - paginate: false, - query: { - $select: ['user', 'text'] - } - }) - assert.deepStrictEqual(Object.keys(messages[0]), ['text', 'user']) - }) - - it('resolves find results with paginated result object', async () => { - const payload = { - userId: user.id, - text - } - - assert.ok(user) - assert.strictEqual(user.password, 'hashed', 'Resolved data') - assert.deepStrictEqual(messageOnPaginatedService, { - id: 0, - ...userProps(user), - ...payload - }) - - const messages = await app.service('paginatedMessages').find({ - provider: 'external', - query: { - $limit: 1, - $skip: 0 - } - }) - - assert.deepStrictEqual(messages, { - limit: 1, - skip: 0, - total: 1, - data: [ - { - id: 0, - ...userProps(user), - ...payload - } - ] - }) - }) - - it('resolves safe dispatch data recursively and with arrays and pages', async () => { - const service = app.service('messages') - const context = await service.get(0, {}, createContext(service as any, 'get')) - const user = { - id: 0, - email: '[redacted]', - name: 'hello (hello@feathersjs.com)' - } - - assert.strictEqual(context.result.user.password, 'hashed') - - assert.deepStrictEqual(context.dispatch, { - text: 'Hi there', - userId: 0, - id: 0, - ...userProps(user) - }) - }) - - it('resolves safe dispatch with static data', async () => { - const service = app.service('custom') - - await service.find() - assert.deepStrictEqual(await service.find(), [{ message: 'Hello' }]) - }) - - it('resolves data for custom methods', async () => { - const result = await app.service('messages').customMethod({ message: 'Hello' }) - const user = { - email: 'hello@feathersjs.com', - password: 'hashed', - id: 0, - name: 'hello (hello@feathersjs.com)' - } - - assert.deepStrictEqual(result, { - message: 'Hello', - userId: 0, - additionalData: 'additional data', - ...userProps(user) - }) - }) - - it('validates and converts the query', async () => { - const otherUser = await app.service('users').create({ - email: 'helloagain@feathersjs.com', - password: 'supersecret' - }) - - await app.service('messages').create({ - text, - userId: otherUser.id - }) - - const messages = await app.service('messages').find({ - paginate: false, - query: { - userId: `${user.id}` - } - }) - - assert.strictEqual(messages.length, 1) - - const userMessages = await app.service('messages').find({ - paginate: false, - user - }) - - assert.strictEqual(userMessages.length, 1) - assert.strictEqual(userMessages[0].userId, user.id) - - const msg = await app.service('messages').get(userMessages[0].id, { - query: { - $resolve: ['user'] - } - }) - - assert.deepStrictEqual(msg, { - user - }) - - assert.rejects( - () => - app.service('messages').find({ - query: { - thing: 'me' - } - }), - { - name: 'BadRequest', - message: 'validation failed', - code: 400, - className: 'bad-request', - data: [ - { - instancePath: '', - schemaPath: '#/additionalProperties', - keyword: 'additionalProperties', - params: { additionalProperty: 'thing' }, - message: 'must NOT have additional properties' - } - ] - } - ) - }) -}) diff --git a/packages/schema/test/json-schema.test.ts b/packages/schema/test/json-schema.test.ts deleted file mode 100644 index d927f8f5a4..0000000000 --- a/packages/schema/test/json-schema.test.ts +++ /dev/null @@ -1,109 +0,0 @@ -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' - -describe('@feathersjs/schema/json-schema', () => { - it('querySyntax works with no properties', async () => { - const schema = { - type: 'object', - properties: querySyntax({}) - } - - new Ajv().compile(schema) - }) - - it('querySyntax with extensions', async () => { - const schema = { - name: { - type: 'string' - }, - age: { - type: 'number' - } - } as const - - const querySchema = { - type: 'object', - properties: querySyntax(schema, { - name: { - $ilike: { - type: 'string' - } - }, - age: { - $value: { - type: 'null' - } - } - } as const) - } as const - - type Query = FromSchema - - const q: Query = { - name: { - $ilike: 'hello' - }, - age: { - $value: null, - $gte: 42 - } - } - - const validator = new Ajv({ strict: false }).compile(querySchema) - - assert.ok(validator(q)) - }) - - it('$in and $nin works with array definitions', async () => { - const schema = { - things: { - type: 'array', - items: { type: 'number' } - } - } as const - - const querySchema = { - type: 'object', - properties: querySyntax(schema) - } as const - - type Query = FromSchema - - const q: Query = { - things: { - $in: [10, 20], - $nin: [30] - } - } - - const validator = new Ajv({ strict: false }).compile(querySchema) - - assert.ok(validator(q)) - }) - - // Test ObjectId validation - it('ObjectId', async () => { - const schema = { - type: 'object', - properties: { - _id: ObjectIdSchema() - } - } - - const validator = new Ajv({ - strict: false - }).compile(schema) - const validated = await validator({ - _id: '507f191e810c19729de860ea' - }) - assert.ok(validated) - - const validated2 = await validator({ - _id: new MongoObjectId() - }) - assert.ok(validated2) - }) -}) diff --git a/packages/schema/test/resolver.test.ts b/packages/schema/test/resolver.test.ts deleted file mode 100644 index 748c3e0650..0000000000 --- a/packages/schema/test/resolver.test.ts +++ /dev/null @@ -1,220 +0,0 @@ -import assert from 'assert' -import { BadRequest } from '@feathersjs/errors' - -import { FromSchema, schema, resolve, virtual } from '../src' - -describe('@feathersjs/schema/resolver', () => { - const userSchema = { - $id: 'simple-user', - type: 'object', - required: ['firstName', 'lastName'], - additionalProperties: false, - properties: { - firstName: { type: 'string' }, - lastName: { type: 'string' }, - password: { type: 'string' } - } - } as const - const context = { - isContext: true - } - - type User = FromSchema & { - name: string - } - - it('simple resolver', async () => { - const userResolver = resolve({ - password: async (): Promise => undefined, - - name: async (_value, user, ctx, status) => { - assert.deepStrictEqual(ctx, context) - assert.deepStrictEqual(status.path, ['name']) - assert.strictEqual(typeof status.stack[0], 'function') - - return `${user.firstName} ${user.lastName}` - } - }) - - const u = await userResolver.resolve( - { - firstName: 'Dave', - lastName: 'L.' - }, - context - ) - - assert.deepStrictEqual(u, { - firstName: 'Dave', - lastName: 'L.', - name: 'Dave L.' - }) - - const withProps = await userResolver.resolve( - { - firstName: 'David', - lastName: 'L' - }, - context, - { - properties: ['name', 'lastName'] - } - ) - - assert.deepStrictEqual(withProps, { - name: 'David L', - lastName: 'L' - }) - }) - - it('simple resolver with virtual', async () => { - const userResolver = resolve({ - password: async (): Promise => undefined, - - name: virtual(async (user, ctx, status) => { - assert.deepStrictEqual(ctx, context) - assert.deepStrictEqual(status.path, ['name']) - assert.strictEqual(typeof status.stack[0], 'function') - - return `${user.firstName} ${user.lastName}` - }) - }) - - const u = await userResolver.resolve( - { - firstName: 'Dave', - lastName: 'L.' - }, - context - ) - - assert.deepStrictEqual(u, { - firstName: 'Dave', - lastName: 'L.', - name: 'Dave L.' - }) - }) - - it('simple resolver with schema and validation', async () => { - const userFeathersSchema = schema(userSchema) - const userBeforeResolver = resolve({ - schema: userFeathersSchema, - validate: 'before', - properties: { - name: async (_name, user) => `${user.firstName} ${user.lastName}` - } - }) - const userAfterResolver = resolve({ - schema: userFeathersSchema, - validate: 'after', - properties: { - firstName: async (): Promise => undefined - } - }) - - await assert.rejects(() => userBeforeResolver.resolve({}, context), { - message: 'validation failed' - }) - await assert.rejects( - () => - userAfterResolver.resolve( - { - firstName: 'Test', - lastName: 'Me' - }, - context - ), - { - message: 'validation failed' - } - ) - }) - - it('simple resolver with converter', async () => { - const userConverterResolver = resolve({ - converter: async (data) => ({ - firstName: 'Default', - lastName: 'Name', - ...data - }), - properties: { - name: async (_name, user) => `${user.firstName} ${user.lastName}` - } - }) - - const u = await userConverterResolver.resolve({}, context) - - assert.deepStrictEqual(u, { - firstName: 'Default', - lastName: 'Name', - name: 'Default Name' - }) - }) - - it('resolving with errors', async () => { - const dummyResolver = resolve<{ name: string; age: number }, Record>({ - properties: { - name: async (value) => { - if (value === 'Dave') { - throw new Error(`No ${value}s allowed`) - } - - return value - }, - age: async (value) => { - if (value && value < 18) { - throw new BadRequest('Invalid age') - } - - return value - } - } - }) - - assert.rejects( - () => - dummyResolver.resolve( - { - name: 'Dave', - age: 16 - }, - {} - ), - { - name: 'BadRequest', - message: 'Error resolving data', - code: 400, - className: 'bad-request', - data: { - name: { message: 'No Daves allowed' }, - age: { - name: 'BadRequest', - message: 'Invalid age', - code: 400, - className: 'bad-request' - } - } - } - ) - }) - - it('empty resolver returns original data', async () => { - const resolver = resolve({ - properties: {} - }) - const data = { message: 'Hello' } - const resolved = await resolver.resolve(data, {}) - - assert.strictEqual(data, resolved) - }) - - it('empty resolver still allows to select properties', async () => { - const data = { message: 'Hello', name: 'David' } - const resolver = resolve({ - properties: {} - }) - const resolved = await resolver.resolve(data, {}, { properties: ['message'] }) - - assert.deepStrictEqual(resolved, { message: 'Hello' }) - }) -}) diff --git a/packages/schema/test/schema.test.ts b/packages/schema/test/schema.test.ts deleted file mode 100644 index a9358dd4a2..0000000000 --- a/packages/schema/test/schema.test.ts +++ /dev/null @@ -1,341 +0,0 @@ -import assert from 'assert' - -import { schema, Infer, queryProperty } from '../src' -import Ajv, { AnySchemaObject } from 'ajv' -import addFormats from 'ajv-formats' - -const customAjv = new Ajv({ - coerceTypes: true -}) -addFormats(customAjv) - -// Utility for converting "date" and "date-time" string formats into Dates. -customAjv.addKeyword({ - keyword: 'convert', - type: 'string', - compile(schemaVal: boolean, parentSchema: AnySchemaObject) { - return ['date-time', 'date'].includes(parentSchema.format) && schemaVal - ? function (value: string, obj: any) { - const { parentData, parentDataProperty } = obj - // Update date-time string to Date object - parentData[parentDataProperty] = new Date(value) - return true - } - : () => true - } -}) - -describe('@feathersjs/schema/schema', () => { - it('type inference and validation', async () => { - const messageSchema = schema({ - $id: 'message-test', - type: 'object', - required: ['text', 'read'], - additionalProperties: false, - properties: { - text: { - type: 'string' - }, - read: { - type: 'boolean' - }, - upvotes: { - type: 'number' - } - } - } as const) - type Message = Infer - - const message = await messageSchema.validate({ - text: 'hi', - read: 0, - upvotes: '10' - }) - - assert.deepStrictEqual(messageSchema.toJSON(), messageSchema.definition) - assert.deepStrictEqual(message, { - text: 'hi', - read: false, - upvotes: 10 - }) - - await assert.rejects(() => messageSchema.validate({ text: 'failing' }), { - name: 'BadRequest', - data: [ - { - instancePath: '', - keyword: 'required', - message: "must have required property 'read'", - params: { - missingProperty: 'read' - }, - schemaPath: '#/required' - } - ] - }) - }) - - it('uses custom AJV with format validation', async () => { - const formatsSchema = schema( - { - $id: 'formats-test', - type: 'object', - required: [], - additionalProperties: false, - properties: { - dobString: { - type: 'string', - format: 'date' - }, - createdAt: { - type: 'string', - format: 'date-time' - } - } - } as const, - customAjv - ) - - await formatsSchema.validate({ - createdAt: '2021-12-22T23:59:59.999Z' - }) - - try { - await formatsSchema.validate({ - createdAt: '2021-12-22T23:59:59.bbb' - }) - } catch (error: any) { - assert.equal(error.data[0].message, 'must match format "date-time"') - } - }) - - it('custom AJV can convert dates', async () => { - const definition = { - $id: 'converts-formats-test', - type: 'object', - required: [], - additionalProperties: false, - properties: { - dobString: queryProperty({ - type: 'string', - format: 'date', - convert: true - }), - createdAt: { - type: 'string', - format: 'date-time', - convert: true - } - } - } as const - - const formatsSchema = schema(definition, customAjv) - - const validated: any = await formatsSchema.validate({ - dobString: { $gt: '2025-04-25' }, - createdAt: '2021-12-22T23:59:59.999Z' - }) - - assert.ok(validated.dobString.$gt instanceof Date) - assert.ok(validated.createdAt instanceof Date) - }) - - it('schema extension and type inference', async () => { - const messageSchema = schema({ - $id: 'message-ext', - type: 'object', - required: ['text', 'read'], - additionalProperties: false, - properties: { - text: { - type: 'string' - }, - read: { - type: 'boolean' - } - } - } as const) - - const messageResultSchema = schema({ - $id: 'message-ext-vote', - type: 'object', - required: ['upvotes', ...messageSchema.definition.required], - additionalProperties: false, - properties: { - ...messageSchema.definition.properties, - upvotes: { - type: 'number' - } - } - } as const) - - type MessageResult = Infer - - const m = await messageResultSchema.validate({ - text: 'Hi', - read: 'false', - upvotes: '23' - }) - - assert.deepStrictEqual(m, { - text: 'Hi', - read: false, - upvotes: 23 - }) - }) - - it('with references', async () => { - const userSchema = schema( - { - $id: 'ref-user', - type: 'object', - required: ['email'], - additionalProperties: false, - properties: { - email: { type: 'string' }, - age: { type: 'number' } - } - } as const, - customAjv - ) - const messageSchema = schema( - { - $id: 'ref-message', - type: 'object', - required: ['text', 'user'], - additionalProperties: false, - properties: { - text: { - type: 'string' - }, - user: { - $ref: 'ref-user' - } - } - } as const, - customAjv - ) - - type User = Infer - type Message = Infer & { - user: User - } - - const res = await messageSchema.validate({ - text: 'Hello', - user: { - email: 'hello@feathersjs.com', - age: '42' - } - }) - - assert.ok(userSchema) - assert.deepStrictEqual(res, { - text: 'Hello', - user: { email: 'hello@feathersjs.com', age: 42 } - }) - }) - - it('works with oneOf properties (#2508)', async () => { - const oneOfSchema = schema({ - $id: 'schemaA', - oneOf: [ - { - type: 'object', - additionalProperties: false, - required: ['x'], - properties: { - x: { type: 'number' } - } - }, - { - type: 'object', - additionalProperties: false, - required: ['y'], - properties: { - y: { type: 'number' } - } - } - ] - } as const) - - const res = await oneOfSchema.validate({ - x: '3' - }) - - assert.deepStrictEqual(res, { x: 3 }) - }) - - it('can handle compound queryProperty', async () => { - const formatsSchema = schema( - { - $id: 'compoundQueryProperty', - type: 'object', - required: [], - additionalProperties: false, - properties: { - dobString: queryProperty({ - oneOf: [ - { type: 'string', format: 'date', convert: true }, - { type: 'string', format: 'date-time', convert: true }, - { type: 'object' } - ] - }) - } - } as const, - customAjv - ) - - const validated = await formatsSchema.validate({ - dobString: { $gt: '2025-04-25', $lte: new Date('2027-04-25') } - }) - - assert.ok(validated) - }) - - it('can still fail queryProperty validation', async () => { - const formatsSchema = schema( - { - $id: 'compoundQueryPropertyFail', - type: 'object', - required: [], - additionalProperties: false, - properties: { - dobString: queryProperty({ type: 'string' }) - } - } as const, - customAjv - ) - - try { - const validated = await formatsSchema.validate({ - dobString: { $moose: 'test' } - }) - assert(!validated, 'should not have gotten here') - } catch (error: any) { - assert.ok(error.data?.length > 0) - } - }) - - it('removes default from queryProperty schemas like $gt', async () => { - const validator = schema( - { - $id: 'noDefault$gt', - type: 'object', - required: [], - additionalProperties: false, - properties: { - someDate: queryProperty({ default: '0000-00-00', type: 'string' }) - } - } as const, - customAjv - ) - - assert.equal( - validator.definition.properties.someDate.anyOf[1].properties.$gt.type, - 'string', - 'type is found under $gt' - ) - assert(!validator.definition.properties.someDate.anyOf[1].properties.$gt.default, 'no default under $gt') - }) -}) diff --git a/packages/schema/tsconfig.json b/packages/schema/tsconfig.json deleted file mode 100644 index 316fd41336..0000000000 --- a/packages/schema/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig", - "include": [ - "src/**/*.ts" - ], - "compilerOptions": { - "outDir": "lib" - } -} diff --git a/packages/socketio-client/CHANGELOG.md b/packages/socketio-client/CHANGELOG.md deleted file mode 100644 index bb0a60555c..0000000000 --- a/packages/socketio-client/CHANGELOG.md +++ /dev/null @@ -1,631 +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.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/socketio-client - -## [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/socketio-client - -## [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/socketio-client - -## [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/socketio-client - -## [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/socketio-client - -## [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/socketio-client - -## [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/socketio-client - -## [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/socketio-client - -## [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/socketio-client - -## [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/socketio-client - -## [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/socketio-client - -## [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/socketio-client - -## [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/socketio-client - -## [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/socketio-client - -## [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/socketio-client - -## [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/socketio-client - -## [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/socketio-client - -## [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/socketio-client - -## [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/socketio-client - -## [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/socketio-client - -## [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/socketio-client - -## [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/socketio-client - -## [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/socketio-client - -## [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/socketio-client - -## [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/socketio-client - -## [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.2](https://github.com/feathersjs/feathers/compare/v5.0.1...v5.0.2) (2023-03-23) - -### Bug Fixes - -- **socketio-client:** Move core dependency to the right spot ([#3117](https://github.com/feathersjs/feathers/issues/3117)) ([6cd66f1](https://github.com/feathersjs/feathers/commit/6cd66f13e4e668defb57074413846550b147a51d)) - -## [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/socketio-client - -# [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/socketio-client - -# [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/socketio-client - -# [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/socketio-client - -# [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/socketio-client - -# [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/socketio-client - -# [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/socketio-client - -# [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/socketio-client - -# [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 @feathersjs/socketio-client - -# [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/socketio-client - -# [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) - -### Bug Fixes - -- **socketio-client:** Make Socket.io client event target compatible ([#2686](https://github.com/feathersjs/feathers/issues/2686)) ([716c49a](https://github.com/feathersjs/feathers/commit/716c49a270e4be5e5276192092c292f72ffcfa19)) - -# [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/socketio-client - -# [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/socketio-client - -# [5.0.0-pre.24](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.23...v5.0.0-pre.24) (2022-06-21) - -### Features - -- **cli:** Add typed client to a generated app ([#2669](https://github.com/feathersjs/feathers/issues/2669)) ([5b801b5](https://github.com/feathersjs/feathers/commit/5b801b5017ddc3eaa95622b539f51d605916bc86)) - -# [5.0.0-pre.23](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.22...v5.0.0-pre.23) (2022-06-06) - -### Features - -- **client:** Improve client side custom method support ([#2654](https://github.com/feathersjs/feathers/issues/2654)) ([c138acf](https://github.com/feathersjs/feathers/commit/c138acf50affbe6b66177d084d3c7a3e9220f09f)) - -# [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/socketio-client - -# [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/socketio-client - -# [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) - -### Features - -- **typescript:** Improve adapter typings ([#2605](https://github.com/feathersjs/feathers/issues/2605)) ([3b2ca0a](https://github.com/feathersjs/feathers/commit/3b2ca0a6a8e03e8390272c4d7e930b4bffdaacf5)) - -# [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/socketio-client - -# [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/socketio-client - -# [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/socketio-client - -# [5.0.0-pre.15](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.14...v5.0.0-pre.15) (2021-11-27) - -### Bug Fixes - -- **typescript:** Overall typing improvements ([#2478](https://github.com/feathersjs/feathers/issues/2478)) ([b8eb804](https://github.com/feathersjs/feathers/commit/b8eb804158556d9651a8607e3c3fda15e0bfd110)) - -# [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/socketio-client - -# [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/socketio-client - -# [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/socketio-client - -# [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/socketio-client - -# [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/socketio-client - -# [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/socketio-client - -# [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/socketio-client - -# [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/socketio-client - -# [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/socketio-client - -# [5.0.0-pre.5](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.4...v5.0.0-pre.5) (2021-06-23) - -### Features - -- **adapter-commons:** Add support for params.adapter option and move memory adapter to @feathersjs/memory ([#2367](https://github.com/feathersjs/feathers/issues/2367)) ([a43e7da](https://github.com/feathersjs/feathers/commit/a43e7da22b6b981a96d1321736ea9a0cb924fb4f)) - -# [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/socketio-client - -# [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/socketio-client - -# [5.0.0-beta.1](https://github.com/feathersjs/feathers/compare/v5.0.0-beta.0...v5.0.0-beta.1) (2021-04-03) - -### Bug Fixes - -- **dependencies:** Fix transport-commons dependency and update other dependencies ([#2284](https://github.com/feathersjs/feathers/issues/2284)) ([05b03b2](https://github.com/feathersjs/feathers/commit/05b03b27b40604d956047e3021d8053c3a137616)) - -# [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)) -- **socketio-client:** Fix client transport-commons reference ([#2164](https://github.com/feathersjs/feathers/issues/2164)) ([3a42c54](https://github.com/feathersjs/feathers/commit/3a42c544058456b19c7e21827226541bfa6ad621)) - -### Features - -- **core:** Public custom service methods ([#2270](https://github.com/feathersjs/feathers/issues/2270)) ([e65abfb](https://github.com/feathersjs/feathers/commit/e65abfb5388df6c19a11c565cf1076a29f32668d)) -- Feathers v5 core refactoring and features ([#2255](https://github.com/feathersjs/feathers/issues/2255)) ([2dafb7c](https://github.com/feathersjs/feathers/commit/2dafb7ce14ba57406aeec13d10ca45b1e709bee9)) -- **transport-commons:** New built-in high performance radix router ([#2177](https://github.com/feathersjs/feathers/issues/2177)) ([6d18065](https://github.com/feathersjs/feathers/commit/6d180651b4eb40289ecea3df3575f207aa6c5d1f)) - -# [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) - -**Note:** Version bump only for package @feathersjs/socketio-client - -# [5.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v4.5.4...v5.0.0-pre.0) (2020-05-19) - -## [4.5.11](https://github.com/feathersjs/feathers/compare/v4.5.10...v4.5.11) (2020-12-05) - -### Bug Fixes - -- **socketio-client:** Throw an error and show a warning if someone tries to use socket.io-client v3 ([#2135](https://github.com/feathersjs/feathers/issues/2135)) ([cc3521c](https://github.com/feathersjs/feathers/commit/cc3521c935a1cbd690e29b7057998e3898f282db)) - -## [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/socketio-client - -## [4.5.9](https://github.com/feathersjs/feathers/compare/v4.5.8...v4.5.9) (2020-10-09) - -## [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/socketio-client - -## [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/socketio-client - -## [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/socketio-client - -## [4.5.6](https://github.com/feathersjs/feathers/compare/v4.5.5...v4.5.6) (2020-07-12) - -**Note:** Version bump only for package @feathersjs/socketio-client - -## [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/socketio-client - -## [4.5.4](https://github.com/feathersjs/feathers/compare/v4.5.3...v4.5.4) (2020-04-29) - -**Note:** Version bump only for package @feathersjs/socketio-client - -## [4.5.3](https://github.com/feathersjs/feathers/compare/v4.5.2...v4.5.3) (2020-04-17) - -**Note:** Version bump only for package @feathersjs/socketio-client - -## [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/socketio-client - -## [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/socketio-client - -# [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/socketio-client - -## [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/socketio-client - -## [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/socketio-client - -# [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/socketio-client - -## [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/socketio-client - -## [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/socketio-client - -## [4.3.9](https://github.com/feathersjs/feathers/compare/v4.3.8...v4.3.9) (2019-10-26) - -**Note:** Version bump only for package @feathersjs/socketio-client - -## [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/socketio-client - -## [4.3.5](https://github.com/feathersjs/feathers/compare/v4.3.4...v4.3.5) (2019-10-07) - -### Bug Fixes - -- Change this reference in client libraries to explicitly passed app ([#1597](https://github.com/feathersjs/feathers/issues/1597)) ([4e4d10a](https://github.com/feathersjs/feathers/commit/4e4d10a)) - -## [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/socketio-client - -## [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/socketio-client - -## [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/socketio-client - -## [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/socketio-client - -# [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/socketio-client - -# [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/socketio-client - -# [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/socketio-client - -# [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/socketio-client - -# [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/socketio-client - -# [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/socketio-client - -# [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/socketio-client - -# [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) - -**Note:** Version bump only for package @feathersjs/socketio-client - -# [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 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)) - -### Features - -- Add TypeScript definitions ([#1275](https://github.com/feathersjs/feathers/issues/1275)) ([9dd6713](https://github.com/feathersjs/feathers/commit/9dd6713)) -- Allow registering a service at the root level ([#1115](https://github.com/feathersjs/feathers/issues/1115)) ([c73d322](https://github.com/feathersjs/feathers/commit/c73d322)) -- Authentication v3 core server implementation ([#1205](https://github.com/feathersjs/feathers/issues/1205)) ([1bd7591](https://github.com/feathersjs/feathers/commit/1bd7591)) - -## [1.2.1](https://github.com/feathersjs/feathers/compare/@feathersjs/socketio-client@1.2.0...@feathersjs/socketio-client@1.2.1) (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)) - - - -# [1.2.0](https://github.com/feathersjs/feathers/compare/@feathersjs/socketio-client@1.1.5...@feathersjs/socketio-client@1.2.0) (2018-12-16) - -### Features - -- Allow registering a service at the root level ([#1115](https://github.com/feathersjs/feathers/issues/1115)) ([c73d322](https://github.com/feathersjs/feathers/commit/c73d322)) - - - -## [1.1.5](https://github.com/feathersjs/feathers/compare/@feathersjs/socketio-client@1.1.4...@feathersjs/socketio-client@1.1.5) (2018-10-25) - -### 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)) - - - -## [1.1.4](https://github.com/feathersjs/feathers/compare/@feathersjs/socketio-client@1.1.3...@feathersjs/socketio-client@1.1.4) (2018-09-21) - -**Note:** Version bump only for package @feathersjs/socketio-client - - - -## [1.1.3](https://github.com/feathersjs/feathers/compare/@feathersjs/socketio-client@1.1.2...@feathersjs/socketio-client@1.1.3) (2018-09-17) - -**Note:** Version bump only for package @feathersjs/socketio-client - - - -## [1.1.2](https://github.com/feathersjs/feathers/compare/@feathersjs/socketio-client@1.1.1...@feathersjs/socketio-client@1.1.2) (2018-09-02) - -**Note:** Version bump only for package @feathersjs/socketio-client - - - -## 1.1.1 - -- Migrate to Monorepo ([feathers#462](https://github.com/feathersjs/feathers/issues/462)) - -## [v1.1.0](https://github.com/feathersjs/socketio-client/tree/v1.1.0) (2018-02-09) - -[Full Changelog](https://github.com/feathersjs/socketio-client/compare/v1.0.3...v1.1.0) - -**Closed issues:** - -- Non compatible with SSR [\#11](https://github.com/feathersjs/socketio-client/issues/11) -- Timeout error, why? [\#9](https://github.com/feathersjs/socketio-client/issues/9) - -**Merged pull requests:** - -- Update @feathersjs/transport-commons to the latest version 🚀 [\#12](https://github.com/feathersjs/socketio-client/pull/12) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v1.0.3](https://github.com/feathersjs/socketio-client/tree/v1.0.3) (2018-02-05) - -[Full Changelog](https://github.com/feathersjs/socketio-client/compare/v1.0.2...v1.0.3) - -**Merged pull requests:** - -- Move to use transport-commons [\#10](https://github.com/feathersjs/socketio-client/pull/10) ([daffl](https://github.com/daffl)) -- Update mocha to the latest version 🚀 [\#8](https://github.com/feathersjs/socketio-client/pull/8) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v1.0.2](https://github.com/feathersjs/socketio-client/tree/v1.0.2) (2018-01-03) - -[Full Changelog](https://github.com/feathersjs/socketio-client/compare/v1.0.1...v1.0.2) - -**Merged pull requests:** - -- Update documentation to correspond with latest release [\#7](https://github.com/feathersjs/socketio-client/pull/7) ([daffl](https://github.com/daffl)) -- Update semistandard to the latest version 🚀 [\#6](https://github.com/feathersjs/socketio-client/pull/6) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update feathers-memory to the latest version 🚀 [\#5](https://github.com/feathersjs/socketio-client/pull/5) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v1.0.1](https://github.com/feathersjs/socketio-client/tree/v1.0.1) (2017-11-16) - -[Full Changelog](https://github.com/feathersjs/socketio-client/compare/v1.0.0...v1.0.1) - -**Merged pull requests:** - -- Add default export for better ES module \(TypeScript\) compatibility [\#4](https://github.com/feathersjs/socketio-client/pull/4) ([daffl](https://github.com/daffl)) - -## [v1.0.0](https://github.com/feathersjs/socketio-client/tree/v1.0.0) (2017-11-01) - -[Full Changelog](https://github.com/feathersjs/socketio-client/compare/v1.0.0-pre.3...v1.0.0) - -**Merged pull requests:** - -- Update dependencies for release [\#3](https://github.com/feathersjs/socketio-client/pull/3) ([daffl](https://github.com/daffl)) - -## [v1.0.0-pre.3](https://github.com/feathersjs/socketio-client/tree/v1.0.0-pre.3) (2017-10-23) - -[Full Changelog](https://github.com/feathersjs/socketio-client/compare/v1.0.0-pre.2...v1.0.0-pre.3) - -**Merged pull requests:** - -- Use scoped npm packages [\#2](https://github.com/feathersjs/socketio-client/pull/2) ([daffl](https://github.com/daffl)) - -## [v1.0.0-pre.2](https://github.com/feathersjs/socketio-client/tree/v1.0.0-pre.2) (2017-10-19) - -[Full Changelog](https://github.com/feathersjs/socketio-client/compare/v1.0.0-pre.1...v1.0.0-pre.2) - -**Merged pull requests:** - -- Update dependencies to enable Greenkeeper 🌴 [\#1](https://github.com/feathersjs/socketio-client/pull/1) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v1.0.0-pre.1](https://github.com/feathersjs/socketio-client/tree/v1.0.0-pre.1) (2017-10-18) - -\* _This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)_ diff --git a/packages/socketio-client/LICENSE b/packages/socketio-client/LICENSE deleted file mode 100644 index 7712f870f3..0000000000 --- a/packages/socketio-client/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2024 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 -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -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 deleted file mode 100644 index 7bb103c6b6..0000000000 --- a/packages/socketio-client/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# @feathersjs/socketio-client - -[![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/socketio-client.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/socketio-client) -[![Discord](https://badgen.net/badge/icon/discord?icon=discord&label)](https://discord.gg/qa8kez8QBx) - -> Client for Socket.io Feathers connections - -## Installation - -``` -npm install @feathersjs/socketio-client --save -``` - -## Documentation - -Refer to the [Feathers SocketIO API documentation](https://feathersjs.com/api/client/socketio.html) 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/socketio-client/package.json b/packages/socketio-client/package.json deleted file mode 100644 index be2965e24b..0000000000 --- a/packages/socketio-client/package.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "name": "@feathersjs/socketio-client", - "description": "The client for Socket.io through feathers-socketio", - "version": "5.0.34", - "homepage": "https://feathersjs.com", - "main": "lib/", - "types": "lib/", - "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", - "directory": "packages/socketio-client" - }, - "author": { - "name": "Feathers contributors", - "email": "hello@feathersjs.com", - "url": "https://feathersjs.com" - }, - "contributors": [], - "bugs": { - "url": "https://github.com/feathersjs/feathers/issues" - }, - "engines": { - "node": ">= 12" - }, - "scripts": { - "prepublish": "npm run compile", - "pack": "npm pack --pack-destination ../generators/test/build", - "compile": "shx rm -rf lib/ && tsc && npm run pack", - "mocha": "mocha --config ../../.mocharc.json --recursive test/**.test.ts test/**/*.test.ts", - "test": "npm run mocha" - }, - "directories": { - "lib": "lib" - }, - "files": [ - "CHANGELOG.md", - "LICENSE", - "README.md", - "src/**", - "lib/**", - "*.d.ts", - "*.js" - ], - "publishConfig": { - "access": "public" - }, - "dependencies": { - "@feathersjs/feathers": "^5.0.34", - "@feathersjs/transport-commons": "^5.0.34" - }, - "devDependencies": { - "@feathersjs/commons": "^5.0.34", - "@feathersjs/memory": "^5.0.34", - "@feathersjs/socketio": "^5.0.34", - "@feathersjs/tests": "^5.0.34", - "@types/mocha": "^10.0.10", - "@types/node": "^24.1.0", - "mocha": "^11.7.1", - "shx": "^0.4.0", - "socket.io-client": "^4.8.1", - "ts-node": "^10.9.2", - "typescript": "^5.9.2" - }, - "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" -} diff --git a/packages/socketio-client/src/index.ts b/packages/socketio-client/src/index.ts deleted file mode 100644 index af4000a1ec..0000000000 --- a/packages/socketio-client/src/index.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { Service, SocketService } from '@feathersjs/transport-commons/client' -import { Socket } from 'socket.io-client' -import { - Application, - TransportConnection, - defaultEventMap, - defaultServiceMethods -} from '@feathersjs/feathers' - -export { SocketService } - -declare module '@feathersjs/feathers/lib/declarations' { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - interface FeathersApplication { - /** - * The Socket.io client instance. Usually does not need - * to be accessed directly. - */ - io?: Socket - } -} - -export default function socketioClient(connection: Socket, options?: any) { - if (!connection) { - throw new Error('Socket.io connection needs to be provided') - } - - const defaultService = function (this: any, name: string) { - const events = Object.values(defaultEventMap) - const settings = Object.assign({}, options, { - events, - name, - connection, - method: 'emit' - }) - - return new Service(settings) as any - } - - const initialize = function (app: Application) { - if (app.io !== undefined) { - throw new Error('Only one default client provider can be configured') - } - - app.io = connection as any - app.defaultService = defaultService - app.mixins.unshift((service, _location, options) => { - if (options && options.methods && service instanceof Service) { - const customMethods = options.methods.filter((name) => !defaultServiceMethods.includes(name)) - - service.methods(...customMethods) - } - }) - } - - initialize.Service = Service - initialize.service = defaultService - - return initialize as TransportConnection -} - -if (typeof module !== 'undefined') { - module.exports = Object.assign(socketioClient, module.exports) -} diff --git a/packages/socketio-client/test/index.test.ts b/packages/socketio-client/test/index.test.ts deleted file mode 100644 index a39f8f84e6..0000000000 --- a/packages/socketio-client/test/index.test.ts +++ /dev/null @@ -1,108 +0,0 @@ -/* eslint-disable @typescript-eslint/ban-ts-comment */ -import { strict as assert } from 'assert' -import { Server } from 'http' -import { CustomMethod, 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' - -type ServiceTypes = { - '/': SocketService - todos: SocketService & { - customMethod: CustomMethod<{ message: string }> - } - [key: string]: any -} - -describe('@feathersjs/socketio-client', () => { - const app = feathers() - - let socket: Socket - let server: Server - - before(async () => { - server = await createServer().listen(9988) - socket = io('http://localhost:9988') - - const connection = socketio(socket) - - app.configure(connection) - app.use('todos', connection.service('todos'), { - methods: ['find', 'get', 'create', 'patch', 'customMethod'] - }) - }) - - after((done) => { - socket.disconnect() - server.close(done) - }) - - it('throws an error with no connection', () => { - try { - // @ts-ignore - feathers().configure(socketio()) - assert.ok(false) - } catch (e: any) { - assert.strictEqual(e.message, 'Socket.io connection needs to be provided') - } - }) - - it('app has the io attribute', () => { - assert.ok((app as any).io) - }) - - it('throws an error when configured twice', () => { - try { - app.configure(socketio(socket)) - assert.ok(false, 'Should never get here') - } catch (e: any) { - assert.strictEqual(e.message, 'Only one default client provider can be configured') - } - }) - - it('can initialize a client instance', async () => { - const init = socketio(socket) - const totoService = init.service('todos') - - assert.ok(totoService instanceof init.Service, 'Returned service is a client') - - const todos = await totoService.find() - - assert.deepEqual(todos, [ - { - text: 'some todo', - complete: false, - id: 0 - } - ]) - }) - - it('return 404 for non-existent service', async () => { - try { - await app.service('not/me').create({}) - assert.fail('Should never get here') - } catch (e: any) { - assert.strictEqual(e.message, "Service 'not/me' not found") - } - }) - - it('is event target compatible', async () => { - app.service('todo').addEventListener('created', (data: any) => assert.ok(data)) - }) - - it('calls .customMethod', async () => { - const service = app.service('todos') - const result = await service.customMethod({ message: 'hi' }) - - assert.deepStrictEqual(result, { - data: { message: 'hi' }, - provider: 'socketio', - type: 'customMethod' - }) - }) - - clientTests(app, 'todos') - clientTests(app, '/') -}) diff --git a/packages/socketio-client/test/server.ts b/packages/socketio-client/test/server.ts deleted file mode 100644 index 8d579a7998..0000000000 --- a/packages/socketio-client/test/server.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { feathers, Id, Params } from '@feathersjs/feathers' -import socketio from '@feathersjs/socketio' -import '@feathersjs/transport-commons' -import { MemoryService } from '@feathersjs/memory' - -// eslint-disable-next-line no-extend-native -Object.defineProperty(Error.prototype, 'toJSON', { - value() { - const alt: any = {} - - Object.getOwnPropertyNames(this).forEach((key: string) => { - alt[key] = this[key] - }, this) - - return alt - }, - configurable: true, - writable: true -}) - -// Create an in-memory CRUD service for our Todos -class TodoService extends MemoryService { - async get(id: Id, params: Params) { - if (params.query.error) { - throw new Error('Something went wrong') - } - - const data = await super.get(id) - - return Object.assign({ query: params.query }, data) - } - - async customMethod(data: any, { provider }: Params) { - return { - data, - provider, - type: 'customMethod' - } - } -} - -export function createServer() { - const app = feathers() - .configure(socketio()) - .use('/', new TodoService()) - .use('/todos', new TodoService(), { - methods: ['find', 'get', 'create', 'update', 'patch', 'remove', 'customMethod'] - }) - const service = app.service('todos') - const rootService = app.service('/') - const publisher = () => app.channel('general') - const data = { - text: 'some todo', - complete: false - } - - app.on('connection', (connection) => app.channel('general').join(connection)) - - rootService.create(data) - rootService.publish(publisher) - - service.create(data) - service.publish(publisher) - - return app -} diff --git a/packages/socketio-client/tsconfig.json b/packages/socketio-client/tsconfig.json deleted file mode 100644 index 316fd41336..0000000000 --- a/packages/socketio-client/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig", - "include": [ - "src/**/*.ts" - ], - "compilerOptions": { - "outDir": "lib" - } -} diff --git a/packages/socketio/CHANGELOG.md b/packages/socketio/CHANGELOG.md deleted file mode 100644 index 3e79cc2cb6..0000000000 --- a/packages/socketio/CHANGELOG.md +++ /dev/null @@ -1,935 +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.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/socketio - -## [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/socketio - -## [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/socketio - -## [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/socketio - -## [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/socketio - -## [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/socketio - -## [5.0.25](https://github.com/feathersjs/feathers/compare/v5.0.24...v5.0.25) (2024-05-03) - -### Bug Fixes - -- Reduce usage of lodash ([#3455](https://github.com/feathersjs/feathers/issues/3455)) ([8ce807a](https://github.com/feathersjs/feathers/commit/8ce807a5ca53ff5b8d5107a0656c6329404e6e6c)) - -## [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/socketio - -## [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/socketio - -## [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/socketio - -## [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/socketio - -## [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/socketio - -## [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/socketio - -## [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/socketio - -## [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/socketio - -## [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/socketio - -## [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/socketio - -## [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/socketio - -## [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/socketio - -## [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/socketio - -## [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/socketio - -## [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/socketio - -## [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/socketio - -## [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/socketio - -## [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/socketio - -## [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/socketio - -# [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/socketio - -# [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/socketio - -# [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/socketio - -# [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/socketio - -# [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) - -### Bug Fixes - -- **socketio:** Disconnect socket on app disconnect event ([#2896](https://github.com/feathersjs/feathers/issues/2896)) ([4ba0039](https://github.com/feathersjs/feathers/commit/4ba003907843cfc2655798a568b16f07ff8adb1b)) - -# [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/socketio - -# [5.0.0-pre.32](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.31...v5.0.0-pre.32) (2022-10-26) - -### Bug Fixes - -- **authentication:** Improve logout and disconnect connection handling ([#2813](https://github.com/feathersjs/feathers/issues/2813)) ([dd77379](https://github.com/feathersjs/feathers/commit/dd77379d8bdcd32d529bef912e672639e4899823)) -- **docs:** Review transport API docs and update Express middleware setup ([#2811](https://github.com/feathersjs/feathers/issues/2811)) ([1b97f14](https://github.com/feathersjs/feathers/commit/1b97f14d474f5613482f259eeaa585c24fcfab43)) - -### Features - -- **cli:** Add authentication client to generated client ([#2801](https://github.com/feathersjs/feathers/issues/2801)) ([bd59f91](https://github.com/feathersjs/feathers/commit/bd59f91b45a01c2eea0c4386e567f4de5aa6ad99)) - -# [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 @feathersjs/socketio - -# [5.0.0-pre.30](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.29...v5.0.0-pre.30) (2022-10-07) - -### Bug Fixes - -- **core:** Ensure setup and teardown can be overriden and maintain hook functionality ([#2779](https://github.com/feathersjs/feathers/issues/2779)) ([ab580cb](https://github.com/feathersjs/feathers/commit/ab580cbcaa68d19144d86798c13bf564f9d424a6)) - -### 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) - -### Bug Fixes - -- **socketio:** Reinitialize hooks on overriden setup method ([#2722](https://github.com/feathersjs/feathers/issues/2722)) ([5e8e7c4](https://github.com/feathersjs/feathers/commit/5e8e7c442238fdc929a0a36b8b8ca2b230ce761f)) - -# [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/socketio - -# [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/socketio - -# [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/socketio - -# [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/socketio - -# [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/socketio - -# [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/socketio - -# [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/socketio - -# [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) - -### Features - -- **typescript:** Improve params and query typeability ([#2600](https://github.com/feathersjs/feathers/issues/2600)) ([df28b76](https://github.com/feathersjs/feathers/commit/df28b7619161f1df5e700326f52cca1a92dc5d28)) - -# [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/socketio - -# [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/socketio - -# [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/socketio - -# [5.0.0-pre.15](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.14...v5.0.0-pre.15) (2021-11-27) - -### Bug Fixes - -- **typescript:** Overall typing improvements ([#2478](https://github.com/feathersjs/feathers/issues/2478)) ([b8eb804](https://github.com/feathersjs/feathers/commit/b8eb804158556d9651a8607e3c3fda15e0bfd110)) - -# [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/socketio - -# [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/socketio - -# [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/socketio - -# [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/socketio - -# [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/socketio - -# [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/socketio - -# [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/socketio - -# [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/socketio - -# [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/socketio - -# [5.0.0-pre.5](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.4...v5.0.0-pre.5) (2021-06-23) - -### Features - -- **adapter-commons:** Add support for params.adapter option and move memory adapter to @feathersjs/memory ([#2367](https://github.com/feathersjs/feathers/issues/2367)) ([a43e7da](https://github.com/feathersjs/feathers/commit/a43e7da22b6b981a96d1321736ea9a0cb924fb4f)) - -# [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/socketio - -# [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)) - -### Features - -- **dependencies:** Remove direct debug dependency ([#2296](https://github.com/feathersjs/feathers/issues/2296)) ([501d416](https://github.com/feathersjs/feathers/commit/501d4164d30c6a126906dc640cdfdc82207ba34a)) - -# [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/socketio - -# [5.0.0-beta.1](https://github.com/feathersjs/feathers/compare/v5.0.0-beta.0...v5.0.0-beta.1) (2021-04-03) - -### Bug Fixes - -- **dependencies:** Fix transport-commons dependency and update other dependencies ([#2284](https://github.com/feathersjs/feathers/issues/2284)) ([05b03b2](https://github.com/feathersjs/feathers/commit/05b03b27b40604d956047e3021d8053c3a137616)) - -# [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)) - -### Features - -- **core:** Public custom service methods ([#2270](https://github.com/feathersjs/feathers/issues/2270)) ([e65abfb](https://github.com/feathersjs/feathers/commit/e65abfb5388df6c19a11c565cf1076a29f32668d)) -- Application service types default to any ([#1566](https://github.com/feathersjs/feathers/issues/1566)) ([d93ba9a](https://github.com/feathersjs/feathers/commit/d93ba9a17edd20d3397bb00f4f6e82e804e42ed6)) -- Feathers v5 core refactoring and features ([#2255](https://github.com/feathersjs/feathers/issues/2255)) ([2dafb7c](https://github.com/feathersjs/feathers/commit/2dafb7ce14ba57406aeec13d10ca45b1e709bee9)) -- **core:** Remove Uberproto ([#2178](https://github.com/feathersjs/feathers/issues/2178)) ([ddf8821](https://github.com/feathersjs/feathers/commit/ddf8821f53317e6a378657f7d66acb03a037ee47)) - -### BREAKING CHANGES - -- **core:** Services no longer extend Uberproto objects and - `service.mixin()` is no longer available. - -# [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) - -### Features - -- **transport-commons:** Remove legacy message format and unnecessary client timeouts ([#1939](https://github.com/feathersjs/feathers/issues/1939)) ([5538881](https://github.com/feathersjs/feathers/commit/5538881a08bc130de42c5984055729d8336f8615)) - -### BREAKING CHANGES - -- **transport-commons:** Removes the old message format and client service timeout - -# [5.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v4.5.4...v5.0.0-pre.0) (2020-05-19) - -### Features - -- **transport-commons:** Remove legacy message format and unnecessary client timeouts ([#1939](https://github.com/feathersjs/feathers/issues/1939)) ([5538881](https://github.com/feathersjs/feathers/commit/5538881a08bc130de42c5984055729d8336f8615)) - -### BREAKING CHANGES - -- **transport-commons:** Removes the old message format and client service timeout - -## [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/socketio - -## [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/socketio - -## [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/socketio - -## [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/socketio - -## [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/socketio - -## [4.5.6](https://github.com/feathersjs/feathers/compare/v4.5.5...v4.5.6) (2020-07-12) - -**Note:** Version bump only for package @feathersjs/socketio - -## [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/socketio - -## [4.5.4](https://github.com/feathersjs/feathers/compare/v4.5.3...v4.5.4) (2020-04-29) - -**Note:** Version bump only for package @feathersjs/socketio - -## [4.5.3](https://github.com/feathersjs/feathers/compare/v4.5.2...v4.5.3) (2020-04-17) - -**Note:** Version bump only for package @feathersjs/socketio - -## [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/socketio - -## [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/socketio - -# [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/socketio - -## [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/socketio - -## [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/socketio - -# [4.4.0](https://github.com/feathersjs/feathers/compare/v4.3.11...v4.4.0) (2019-11-27) - -### Features - -- **authentication:** Add parseStrategies to allow separate strategies for creating JWTs and parsing headers ([#1708](https://github.com/feathersjs/feathers/issues/1708)) ([5e65629](https://github.com/feathersjs/feathers/commit/5e65629b924724c3e81d7c81df047e123d1c8bd7)) - -## [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/socketio - -## [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/socketio - -## [4.3.9](https://github.com/feathersjs/feathers/compare/v4.3.8...v4.3.9) (2019-10-26) - -**Note:** Version bump only for package @feathersjs/socketio - -## [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/socketio - -## [4.3.5](https://github.com/feathersjs/feathers/compare/v4.3.4...v4.3.5) (2019-10-07) - -**Note:** Version bump only for package @feathersjs/socketio - -## [4.3.4](https://github.com/feathersjs/feathers/compare/v4.3.3...v4.3.4) (2019-10-03) - -### Bug Fixes - -- Typing improvements ([#1580](https://github.com/feathersjs/feathers/issues/1580)) ([7818aec](https://github.com/feathersjs/feathers/commit/7818aec)) - -## [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/socketio - -## [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/socketio - -## [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/socketio - -# [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/socketio - -# [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/socketio - -# [4.3.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.2...v4.3.0-pre.3) (2019-08-19) - -### Bug Fixes - -- Expire and remove authenticated real-time connections ([#1512](https://github.com/feathersjs/feathers/issues/1512)) ([2707c33](https://github.com/feathersjs/feathers/commit/2707c33)) -- Use WeakMap to connect socket to connection ([#1509](https://github.com/feathersjs/feathers/issues/1509)) ([64807e3](https://github.com/feathersjs/feathers/commit/64807e3)) - -# [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/socketio - -# [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/socketio - -# [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/socketio - -# [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/socketio - -# [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)) - -### Features - -- Add global disconnect event ([#1355](https://github.com/feathersjs/feathers/issues/1355)) ([85afcca](https://github.com/feathersjs/feathers/commit/85afcca)) - -# [4.0.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.0...v4.0.0-pre.1) (2019-05-08) - -### Features - -- Add params.headers to all transports when available ([#1303](https://github.com/feathersjs/feathers/issues/1303)) ([ebce79b](https://github.com/feathersjs/feathers/commit/ebce79b)) - -# [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 all dependencies to latest ([#1206](https://github.com/feathersjs/feathers/issues/1206)) ([e51e0f6](https://github.com/feathersjs/feathers/commit/e51e0f6)) -- **package:** update debug to version 3.0.0 ([#83](https://github.com/feathersjs/feathers/issues/83)) ([49f1de9](https://github.com/feathersjs/feathers/commit/49f1de9)) -- **package:** update socket.io to version 2.0.0 ([#75](https://github.com/feathersjs/feathers/issues/75)) ([d4a4b71](https://github.com/feathersjs/feathers/commit/d4a4b71)) - -### chore - -- drop support for Node.js 0.10 ([#48](https://github.com/feathersjs/feathers/issues/48)) ([3f7555a](https://github.com/feathersjs/feathers/commit/3f7555a)) - -### Features - -- Add TypeScript definitions ([#1275](https://github.com/feathersjs/feathers/issues/1275)) ([9dd6713](https://github.com/feathersjs/feathers/commit/9dd6713)) - -### BREAKING CHANGES - -- This module no longer supports Node.js 0.10 - -## [3.2.9](https://github.com/feathersjs/feathers/compare/@feathersjs/socketio@3.2.8...@feathersjs/socketio@3.2.9) (2019-01-02) - -**Note:** Version bump only for package @feathersjs/socketio - - - -## [3.2.8](https://github.com/feathersjs/feathers/compare/@feathersjs/socketio@3.2.7...@feathersjs/socketio@3.2.8) (2018-12-16) - -**Note:** Version bump only for package @feathersjs/socketio - - - -## [3.2.7](https://github.com/feathersjs/feathers/compare/@feathersjs/socketio@3.2.6...@feathersjs/socketio@3.2.7) (2018-10-25) - -### 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.2.6](https://github.com/feathersjs/feathers/compare/@feathersjs/socketio@3.2.5...@feathersjs/socketio@3.2.6) (2018-09-21) - -**Note:** Version bump only for package @feathersjs/socketio - - - -## [3.2.5](https://github.com/feathersjs/feathers/compare/@feathersjs/socketio@3.2.4...@feathersjs/socketio@3.2.5) (2018-09-17) - -**Note:** Version bump only for package @feathersjs/socketio - - - -## [3.2.4](https://github.com/feathersjs/feathers/compare/@feathersjs/socketio@3.2.3...@feathersjs/socketio@3.2.4) (2018-09-02) - -**Note:** Version bump only for package @feathersjs/socketio - - - -## 3.2.3 - -- Migrate to Monorepo ([feathers#462](https://github.com/feathersjs/feathers/issues/462)) - -## [v3.2.2](https://github.com/feathersjs/socketio/tree/v3.2.2) (2018-06-03) - -[Full Changelog](https://github.com/feathersjs/socketio/compare/v3.2.1...v3.2.2) - -**Merged pull requests:** - -- Update uberproto to the latest version 🚀 [\#117](https://github.com/feathersjs/socketio/pull/117) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v3.2.1](https://github.com/feathersjs/socketio/tree/v3.2.1) (2018-04-04) - -[Full Changelog](https://github.com/feathersjs/socketio/compare/v3.2.0...v3.2.1) - -**Closed issues:** - -- Connection closed before receiving a handshake response [\#113](https://github.com/feathersjs/socketio/issues/113) -- `yarn add @feathersjs/socketio` gets stuck [\#112](https://github.com/feathersjs/socketio/issues/112) - -**Merged pull requests:** - -- Use latest version of Socket.io \(2.1.0\) [\#115](https://github.com/feathersjs/socketio/pull/115) ([daffl](https://github.com/daffl)) - -## [v3.2.0](https://github.com/feathersjs/socketio/tree/v3.2.0) (2018-02-09) - -[Full Changelog](https://github.com/feathersjs/socketio/compare/v3.1.0...v3.2.0) - -**Closed issues:** - -- My chat room sometimes the user's text has become????? [\#109](https://github.com/feathersjs/socketio/issues/109) - -**Merged pull requests:** - -- Update @feathersjs/transport-commons to the latest version 🚀 [\#111](https://github.com/feathersjs/socketio/pull/111) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v3.1.0](https://github.com/feathersjs/socketio/tree/v3.1.0) (2018-01-30) - -[Full Changelog](https://github.com/feathersjs/socketio/compare/v3.0.2...v3.1.0) - -**Closed issues:** - -- How to change 5000ms timeout? [\#107](https://github.com/feathersjs/socketio/issues/107) - -**Merged pull requests:** - -- Change dependency to @feathersjs/transport-commons [\#110](https://github.com/feathersjs/socketio/pull/110) ([daffl](https://github.com/daffl)) -- Update mocha to the latest version 🚀 [\#108](https://github.com/feathersjs/socketio/pull/108) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v3.0.2](https://github.com/feathersjs/socketio/tree/v3.0.2) (2018-01-03) - -[Full Changelog](https://github.com/feathersjs/socketio/compare/v3.0.1...v3.0.2) - -**Closed issues:** - -- Updated from feathers-socketio to @feathersjs/socketio; error message [\#104](https://github.com/feathersjs/socketio/issues/104) -- How to stop listening to socket server from client service [\#103](https://github.com/feathersjs/socketio/issues/103) -- Options are not passed to socket-io [\#101](https://github.com/feathersjs/socketio/issues/101) -- feathers / graphql using REST / Sockets [\#97](https://github.com/feathersjs/socketio/issues/97) - -**Merged pull requests:** - -- Update Readme to correspond with latest release [\#106](https://github.com/feathersjs/socketio/pull/106) ([daffl](https://github.com/daffl)) -- Update semistandard to the latest version 🚀 [\#105](https://github.com/feathersjs/socketio/pull/105) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update feathers-memory to the latest version 🚀 [\#102](https://github.com/feathersjs/socketio/pull/102) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v3.0.1](https://github.com/feathersjs/socketio/tree/v3.0.1) (2017-11-16) - -[Full Changelog](https://github.com/feathersjs/socketio/compare/v3.0.0...v3.0.1) - -**Closed issues:** - -- Remote address IP is always undefined [\#96](https://github.com/feathersjs/socketio/issues/96) - -**Merged pull requests:** - -- Add default export for better ES module \(TypeScript\) compatibility [\#100](https://github.com/feathersjs/socketio/pull/100) ([daffl](https://github.com/daffl)) -- Updating client use example to fix imports [\#99](https://github.com/feathersjs/socketio/pull/99) ([corymsmith](https://github.com/corymsmith)) - -## [v3.0.0](https://github.com/feathersjs/socketio/tree/v3.0.0) (2017-11-01) - -[Full Changelog](https://github.com/feathersjs/socketio/compare/v2.0.1...v3.0.0) - -**Merged pull requests:** - -- Update dependencies for release [\#95](https://github.com/feathersjs/socketio/pull/95) ([daffl](https://github.com/daffl)) -- Throw an error when using an incompatible version of Feathers [\#94](https://github.com/feathersjs/socketio/pull/94) ([daffl](https://github.com/daffl)) - -## [v2.0.1](https://github.com/feathersjs/socketio/tree/v2.0.1) (2017-10-31) - -[Full Changelog](https://github.com/feathersjs/socketio/compare/v3.0.0-pre.4...v2.0.1) - -**Merged pull requests:** - -- Add an error when trying to use earlier versions with Feathers v3 [\#93](https://github.com/feathersjs/socketio/pull/93) ([daffl](https://github.com/daffl)) - -## [v3.0.0-pre.4](https://github.com/feathersjs/socketio/tree/v3.0.0-pre.4) (2017-10-25) - -[Full Changelog](https://github.com/feathersjs/socketio/compare/v3.0.0-pre.3...v3.0.0-pre.4) - -## [v3.0.0-pre.3](https://github.com/feathersjs/socketio/tree/v3.0.0-pre.3) (2017-10-22) - -[Full Changelog](https://github.com/feathersjs/socketio/compare/v3.0.0-pre.2...v3.0.0-pre.3) - -**Merged pull requests:** - -- Rename repository and update to using npm scopes [\#92](https://github.com/feathersjs/socketio/pull/92) ([daffl](https://github.com/daffl)) -- Updates for Feathers v3 \(Buzzard\) [\#91](https://github.com/feathersjs/socketio/pull/91) ([daffl](https://github.com/daffl)) - -## [v3.0.0-pre.2](https://github.com/feathersjs/socketio/tree/v3.0.0-pre.2) (2017-10-18) - -[Full Changelog](https://github.com/feathersjs/socketio/compare/v3.0.0-pre.1...v3.0.0-pre.2) - -**Merged pull requests:** - -- Some finishing touches for v3 [\#90](https://github.com/feathersjs/socketio/pull/90) ([daffl](https://github.com/daffl)) - -## [v3.0.0-pre.1](https://github.com/feathersjs/socketio/tree/v3.0.0-pre.1) (2017-10-17) - -[Full Changelog](https://github.com/feathersjs/socketio/compare/v2.0.0...v3.0.0-pre.1) - -**Closed issues:** - -- Filter service updates by ID [\#87](https://github.com/feathersjs/socketio/issues/87) -- An in-range update of mocha is breaking the build 🚨 [\#86](https://github.com/feathersjs/socketio/issues/86) -- An in-range update of babel-cli is breaking the build 🚨 [\#85](https://github.com/feathersjs/socketio/issues/85) -- Connection closed before receiving a handshake response [\#84](https://github.com/feathersjs/socketio/issues/84) -- Maybe acting wrong please look into my test app [\#81](https://github.com/feathersjs/socketio/issues/81) -- Connecting to sockets on a path [\#80](https://github.com/feathersjs/socketio/issues/80) -- An in-range update of babel-core is breaking the build 🚨 [\#79](https://github.com/feathersjs/socketio/issues/79) -- An in-range update of mocha is breaking the build 🚨 [\#78](https://github.com/feathersjs/socketio/issues/78) -- Add Socket.io v2 support [\#77](https://github.com/feathersjs/socketio/issues/77) -- Any chance for socket.io-p2p support? [\#37](https://github.com/feathersjs/socketio/issues/37) - -**Merged pull requests:** - -- Finalizing updates for Feathers v3 [\#89](https://github.com/feathersjs/socketio/pull/89) ([daffl](https://github.com/daffl)) -- Update mocha to the latest version 🚀 [\#88](https://github.com/feathersjs/socketio/pull/88) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update debug to the latest version 🚀 [\#83](https://github.com/feathersjs/socketio/pull/83) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update to latest plugin infrastructure [\#82](https://github.com/feathersjs/socketio/pull/82) ([daffl](https://github.com/daffl)) - -## [v2.0.0](https://github.com/feathersjs/socketio/tree/v2.0.0) (2017-05-10) - -[Full Changelog](https://github.com/feathersjs/socketio/compare/v1.6.0...v2.0.0) - -**Closed issues:** - -- An in-range update of feathers-hooks is breaking the build 🚨 [\#74](https://github.com/feathersjs/socketio/issues/74) -- An in-range update of debug is breaking the build 🚨 [\#73](https://github.com/feathersjs/socketio/issues/73) -- An in-range update of debug is breaking the build 🚨 [\#71](https://github.com/feathersjs/socketio/issues/71) - -**Merged pull requests:** - -- Update socket.io-client to the latest version 🚀 [\#76](https://github.com/feathersjs/socketio/pull/76) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update socket.io to the latest version 🚀 [\#75](https://github.com/feathersjs/socketio/pull/75) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update semistandard to the latest version 🚀 [\#72](https://github.com/feathersjs/socketio/pull/72) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v1.6.0](https://github.com/feathersjs/socketio/tree/v1.6.0) (2017-04-18) - -[Full Changelog](https://github.com/feathersjs/socketio/compare/v1.5.2...v1.6.0) - -**Closed issues:** - -- Add headers and remote ip address to socket.feathers [\#67](https://github.com/feathersjs/socketio/issues/67) - -**Merged pull requests:** - -- Update feathers-hooks to the latest version 🚀 [\#70](https://github.com/feathersjs/socketio/pull/70) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Add port argument [\#69](https://github.com/feathersjs/socketio/pull/69) ([kozzztya](https://github.com/kozzztya)) -- Update dependencies to enable Greenkeeper 🌴 [\#68](https://github.com/feathersjs/socketio/pull/68) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v1.5.2](https://github.com/feathersjs/socketio/tree/v1.5.2) (2017-03-03) - -[Full Changelog](https://github.com/feathersjs/socketio/compare/v1.5.1...v1.5.2) - -**Merged pull requests:** - -- Server-side socketio typedef to allow `import \* as` syntax when importing [\#65](https://github.com/feathersjs/socketio/pull/65) ([myknbani](https://github.com/myknbani)) - -## [v1.5.1](https://github.com/feathersjs/socketio/tree/v1.5.1) (2017-03-02) - -[Full Changelog](https://github.com/feathersjs/socketio/compare/v1.5.0...v1.5.1) - -**Closed issues:** - -- Typescript definition bug [\#63](https://github.com/feathersjs/socketio/issues/63) - -**Merged pull requests:** - -- fix Typescript issue \(\#63\) [\#64](https://github.com/feathersjs/socketio/pull/64) ([superbarne](https://github.com/superbarne)) -- feathers-hooks@1.8.0 breaks build 🚨 [\#62](https://github.com/feathersjs/socketio/pull/62) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) - -## [v1.5.0](https://github.com/feathersjs/socketio/tree/v1.5.0) (2017-03-01) - -[Full Changelog](https://github.com/feathersjs/socketio/compare/v1.4.3...v1.5.0) - -**Merged pull requests:** - -- Typescript Definitions [\#60](https://github.com/feathersjs/socketio/pull/60) ([AbraaoAlves](https://github.com/AbraaoAlves)) - -## [v1.4.3](https://github.com/feathersjs/socketio/tree/v1.4.3) (2017-02-24) - -[Full Changelog](https://github.com/feathersjs/socketio/compare/v1.4.2...v1.4.3) - -**Closed issues:** - -- Get data after connection established [\#59](https://github.com/feathersjs/socketio/issues/59) -- Unable to use feathers from within React \(Feathers vs SocketIO implementation setup issue\) [\#51](https://github.com/feathersjs/socketio/issues/51) - -**Merged pull requests:** - -- Add option to set the maxListeners [\#61](https://github.com/feathersjs/socketio/pull/61) ([Faianca](https://github.com/Faianca)) -- Create .codeclimate.yml [\#56](https://github.com/feathersjs/socketio/pull/56) ([larkinscott](https://github.com/larkinscott)) -- socket.io@1.7.1 breaks build 🚨 [\#54](https://github.com/feathersjs/socketio/pull/54) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Update feathers-memory to version 1.0.0 🚀 [\#50](https://github.com/feathersjs/socketio/pull/50) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Update feathers-commons to version 0.8.0 🚀 [\#49](https://github.com/feathersjs/socketio/pull/49) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) - -## [v1.4.2](https://github.com/feathersjs/socketio/tree/v1.4.2) (2016-11-02) - -[Full Changelog](https://github.com/feathersjs/socketio/compare/v1.4.1...v1.4.2) - -**Closed issues:** - -- Upgrade to socket.io 1.4 [\#39](https://github.com/feathersjs/socketio/issues/39) -- Disable/restrict failed request queue? [\#38](https://github.com/feathersjs/socketio/issues/38) -- Uncaught \(in promise\) Error: Timeout of 5000ms exceeded calling sites::find\(…\) [\#36](https://github.com/feathersjs/socketio/issues/36) -- Regarding plain websockets [\#34](https://github.com/feathersjs/socketio/issues/34) -- Clean way to subscribe to a filtered set of events [\#32](https://github.com/feathersjs/socketio/issues/32) -- "Can't find variable: Reflect" on bad requests/authentication token missing; react-native [\#31](https://github.com/feathersjs/socketio/issues/31) -- Client should convert error objects to feathers-errors [\#30](https://github.com/feathersjs/socketio/issues/30) - -**Merged pull requests:** - -- 👻😱 Node.js 0.10 is unmaintained 😱👻 [\#48](https://github.com/feathersjs/socketio/pull/48) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Swapping rm to rifraf and using relative path to \_mocha for windows support [\#47](https://github.com/feathersjs/socketio/pull/47) ([corymsmith](https://github.com/corymsmith)) -- jshint —\> semistandard [\#46](https://github.com/feathersjs/socketio/pull/46) ([corymsmith](https://github.com/corymsmith)) -- update feathers dev dependency [\#45](https://github.com/feathersjs/socketio/pull/45) ([ekryski](https://github.com/ekryski)) -- adding code coverage [\#44](https://github.com/feathersjs/socketio/pull/44) ([ekryski](https://github.com/ekryski)) -- socket.io-client@1.5.0 breaks build 🚨 [\#43](https://github.com/feathersjs/socketio/pull/43) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Update feathers-memory to version 0.8.0 🚀 [\#35](https://github.com/feathersjs/socketio/pull/35) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Update mocha to version 3.0.0 🚀 [\#33](https://github.com/feathersjs/socketio/pull/33) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) - -## [v1.4.1](https://github.com/feathersjs/socketio/tree/v1.4.1) (2016-05-23) - -[Full Changelog](https://github.com/feathersjs/socketio/compare/v1.4.0...v1.4.1) - -**Closed issues:** - -- README.md broken link to provider documentation [\#23](https://github.com/feathersjs/socketio/issues/23) -- Insecure Defaults Allow MITM Over TLS [\#22](https://github.com/feathersjs/socketio/issues/22) - -**Merged pull requests:** - -- mocha@2.5.0 breaks build 🚨 [\#28](https://github.com/feathersjs/socketio/pull/28) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Update feathers-socket-commons to version 2.0.0 🚀 [\#27](https://github.com/feathersjs/socketio/pull/27) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Update babel-plugin-add-module-exports to version 0.2.0 🚀 [\#26](https://github.com/feathersjs/socketio/pull/26) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- fix link in README.md to feathers-socketio API docs [\#24](https://github.com/feathersjs/socketio/pull/24) ([ElliotPsyIT](https://github.com/ElliotPsyIT)) - -## [v1.4.0](https://github.com/feathersjs/socketio/tree/v1.4.0) (2016-04-28) - -[Full Changelog](https://github.com/feathersjs/socketio/compare/v1.3.4...v1.4.0) - -**Merged pull requests:** - -- Client timeout [\#21](https://github.com/feathersjs/socketio/pull/21) ([daffl](https://github.com/daffl)) -- Update feathers-socket-commons to version 1.0.0 🚀 [\#20](https://github.com/feathersjs/socketio/pull/20) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- nsp@2.3.2 breaks build 🚨 [\#18](https://github.com/feathersjs/socketio/pull/18) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- More tests for error cases [\#16](https://github.com/feathersjs/socketio/pull/16) ([daffl](https://github.com/daffl)) - -## [v1.3.4](https://github.com/feathersjs/socketio/tree/v1.3.4) (2016-04-16) - -[Full Changelog](https://github.com/feathersjs/socketio/compare/v1.3.3...v1.3.4) - -**Merged pull requests:** - -- Increase the default number of maximum event listeners [\#15](https://github.com/feathersjs/socketio/pull/15) ([daffl](https://github.com/daffl)) -- Update feathers-memory to version 0.7.0 🚀 [\#14](https://github.com/feathersjs/socketio/pull/14) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) - -## [v1.3.3](https://github.com/feathersjs/socketio/tree/v1.3.3) (2016-02-18) - -[Full Changelog](https://github.com/feathersjs/socketio/compare/v1.3.2...v1.3.3) - -**Closed issues:** - -- Needs possibility to pass options to io.listen\(\) [\#12](https://github.com/feathersjs/socketio/issues/12) - -**Merged pull requests:** - -- Allow to pass Socket.io options [\#13](https://github.com/feathersjs/socketio/pull/13) ([daffl](https://github.com/daffl)) - -## [v1.3.2](https://github.com/feathersjs/socketio/tree/v1.3.2) (2016-02-11) - -[Full Changelog](https://github.com/feathersjs/socketio/compare/v1.3.1...v1.3.2) - -**Merged pull requests:** - -- Allow to instantiate a client instance [\#11](https://github.com/feathersjs/socketio/pull/11) ([daffl](https://github.com/daffl)) - -## [v1.3.1](https://github.com/feathersjs/socketio/tree/v1.3.1) (2016-02-09) - -[Full Changelog](https://github.com/feathersjs/socketio/compare/v1.3.0...v1.3.1) - -## [v1.3.0](https://github.com/feathersjs/socketio/tree/v1.3.0) (2016-02-09) - -[Full Changelog](https://github.com/feathersjs/socketio/compare/v1.2.0...v1.3.0) - -**Merged pull requests:** - -- Update feathers-memory to version 0.6.0 🚀 [\#8](https://github.com/feathersjs/socketio/pull/8) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Update lodash to version 4.0.1 🚀 [\#7](https://github.com/feathersjs/socketio/pull/7) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- Adding nsp check [\#6](https://github.com/feathersjs/socketio/pull/6) ([marshallswain](https://github.com/marshallswain)) - -## [v1.2.0](https://github.com/feathersjs/socketio/tree/v1.2.0) (2016-01-21) - -[Full Changelog](https://github.com/feathersjs/socketio/compare/v1.1.0...v1.2.0) - -**Closed issues:** - -- Better event filtering [\#2](https://github.com/feathersjs/socketio/issues/2) - -**Merged pull requests:** - -- Refactoring to use feathers-socket-commons that support event filtering [\#5](https://github.com/feathersjs/socketio/pull/5) ([daffl](https://github.com/daffl)) -- Fixing .npmignore entries [\#3](https://github.com/feathersjs/socketio/pull/3) ([corymsmith](https://github.com/corymsmith)) - -## [v1.1.0](https://github.com/feathersjs/socketio/tree/v1.1.0) (2016-01-10) - -[Full Changelog](https://github.com/feathersjs/socketio/compare/v1.0.0...v1.1.0) - -**Merged pull requests:** - -- feathers-socketio/client service and tests [\#1](https://github.com/feathersjs/socketio/pull/1) ([daffl](https://github.com/daffl)) - -## [v1.0.0](https://github.com/feathersjs/socketio/tree/v1.0.0) (2016-01-03) - -\* _This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)_ diff --git a/packages/socketio/LICENSE b/packages/socketio/LICENSE deleted file mode 100644 index 7712f870f3..0000000000 --- a/packages/socketio/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2024 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 -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -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 deleted file mode 100644 index 2ba5ebaee2..0000000000 --- a/packages/socketio/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# @feathersjs/socketio - -[![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/socketio.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/socketio) -[![Discord](https://badgen.net/badge/icon/discord?icon=discord&label)](https://discord.gg/qa8kez8QBx) - -> The Feathers Socket.io real-time API provider - -## Installation - -``` -npm install @feathersjs/socketio --save -``` - -## Documentation - -Refer to the [Feathers SocketIO API documentation](https://feathersjs.com/api/socketio.html) 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/socketio/package.json b/packages/socketio/package.json deleted file mode 100644 index ed95e5efc5..0000000000 --- a/packages/socketio/package.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "name": "@feathersjs/socketio", - "description": "The Feathers Socket.io real-time API provider", - "version": "5.0.34", - "homepage": "https://feathersjs.com", - "main": "lib/", - "types": "lib/", - "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", - "directory": "packages/socketio" - }, - "author": { - "name": "Feathers contributors", - "email": "hello@feathersjs.com", - "url": "https://feathersjs.com" - }, - "contributors": [], - "bugs": { - "url": "https://github.com/feathersjs/feathers/issues" - }, - "engines": { - "node": ">= 12" - }, - "files": [ - "CHANGELOG.md", - "LICENSE", - "README.md", - "src/**", - "lib/**", - "*.d.ts", - "*.js" - ], - "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" - }, - "directories": { - "lib": "lib" - }, - "publishConfig": { - "access": "public" - }, - "dependencies": { - "@feathersjs/commons": "^5.0.34", - "@feathersjs/feathers": "^5.0.34", - "@feathersjs/transport-commons": "^5.0.34", - "socket.io": "^4.8.1" - }, - "devDependencies": { - "@feathersjs/express": "^5.0.34", - "@feathersjs/memory": "^5.0.34", - "@feathersjs/tests": "^5.0.34", - "@types/mocha": "^10.0.10", - "@types/node": "^24.1.0", - "lodash": "^4.17.21", - "mocha": "^11.7.1", - "shx": "^0.4.0", - "socket.io-client": "^4.8.1", - "typescript": "^5.9.2" - }, - "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" -} diff --git a/packages/socketio/src/index.ts b/packages/socketio/src/index.ts deleted file mode 100644 index d502cade9f..0000000000 --- a/packages/socketio/src/index.ts +++ /dev/null @@ -1,103 +0,0 @@ -import http from 'http' -import { Server, ServerOptions } from 'socket.io' -import { createDebug } from '@feathersjs/commons' -import { Application, RealTimeConnection } from '@feathersjs/feathers' -import { socket } from '@feathersjs/transport-commons' - -import { disconnect, params, authentication, FeathersSocket } from './middleware' - -const debug = createDebug('@feathersjs/socketio') - -declare module '@feathersjs/feathers/lib/declarations' { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - interface Application { - io: any - listen(options: any): Promise - } -} - -function configureSocketio(callback?: (io: Server) => void): (app: Application) => void -function configureSocketio( - options: number | Partial, - callback?: (io: Server) => void -): (app: Application) => void -function configureSocketio( - port: number, - options?: Partial, - callback?: (io: Server) => void -): (app: Application) => void -function configureSocketio(port?: any, options?: any, config?: any) { - if (typeof port !== 'number') { - config = options - options = port - port = null - } - - if (typeof options !== 'object') { - config = options - options = {} - } - - return (app: Application) => { - // Function that gets the connection - const getParams = (socket: FeathersSocket) => socket.feathers - // A mapping from connection to socket instance - const socketMap = new WeakMap() - // Promise that resolves with the Socket.io `io` instance - // when `setup` has been called (with a server) - const done = new Promise((resolve) => { - const { listen, setup } = app as any - - Object.assign(app, { - async listen(this: any, ...args: any[]) { - if (typeof listen === 'function') { - // If `listen` already exists - // usually the case when the app has been expressified - return listen.call(this, ...args) - } - - const server = http.createServer() - - await this.setup(server) - - return server.listen(...args) - }, - - async setup(this: any, server: http.Server, ...rest: any[]) { - if (!this.io) { - const io = (this.io = new Server(port || server, options)) - - io.use(disconnect(app, getParams, socketMap)) - io.use(params(app, socketMap)) - io.use(authentication(app, getParams)) - - // In Feathers it is easy to hit the standard Node warning limit - // of event listeners (e.g. by registering 10 services). - // So we set it to a higher number. 64 should be enough for everyone. - io.sockets.setMaxListeners(64) - } - - if (typeof config === 'function') { - debug('Calling SocketIO configuration function') - config.call(this, this.io) - } - - resolve(this.io) - - return setup.call(this, server, ...rest) - } - }) - }) - - app.configure( - socket({ - done, - socketMap, - getParams, - emit: 'emit' - }) - ) - } -} - -export = configureSocketio diff --git a/packages/socketio/src/middleware.ts b/packages/socketio/src/middleware.ts deleted file mode 100644 index a16fdc8339..0000000000 --- a/packages/socketio/src/middleware.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { Application, Params, RealTimeConnection } from '@feathersjs/feathers' -import { createDebug } from '@feathersjs/commons' -import { Socket } from 'socket.io' - -const debug = createDebug('@feathersjs/socketio/middleware') - -export type ParamsGetter = (socket: Socket) => any -export type NextFunction = (err?: any) => void -export interface FeathersSocket extends Socket { - feathers?: Params & { [key: string]: any } -} - -export const disconnect = ( - app: Application, - getParams: ParamsGetter, - socketMap: WeakMap -) => { - app.on('disconnect', (connection: RealTimeConnection) => { - const socket = socketMap.get(connection) - if (socket && socket.connected) { - socket.disconnect() - } - }) - - return (socket: FeathersSocket, next: NextFunction) => { - socket.on('disconnect', () => app.emit('disconnect', getParams(socket))) - next() - } -} - -export const params = - (_app: Application, socketMap: WeakMap) => - (socket: FeathersSocket, next: NextFunction) => { - socket.feathers = { - provider: 'socketio', - headers: socket.handshake.headers - } - - socketMap.set(socket.feathers, socket) - - next() - } - -export const authentication = - (app: Application, getParams: ParamsGetter, settings: any = {}) => - (socket: FeathersSocket, next: NextFunction) => { - const service = (app as any).defaultAuthentication - ? (app as any).defaultAuthentication(settings.service) - : null - - if (service === null) { - return next() - } - - const config = service.configuration - const authStrategies = config.parseStrategies || config.authStrategies || [] - - if (authStrategies.length === 0) { - return next() - } - - service - .parse(socket.handshake, null, ...authStrategies) - .then(async (authentication: any) => { - if (authentication) { - debug('Parsed authentication from HTTP header', authentication) - socket.feathers.authentication = authentication - await service.create(authentication, { - provider: 'socketio', - connection: getParams(socket) - }) - } - - next() - }) - .catch(next) - } diff --git a/packages/socketio/test/events.ts b/packages/socketio/test/events.ts deleted file mode 100644 index 52b94e8944..0000000000 --- a/packages/socketio/test/events.ts +++ /dev/null @@ -1,216 +0,0 @@ -import { strict as assert } from 'assert' -import { io, Socket } from 'socket.io-client' -import { verify } from '@feathersjs/tests' -import { RealTimeConnection } from '@feathersjs/feathers' - -export default (name: string, options: any) => { - const call = (method: string, ...args: any[]) => { - return new Promise((resolve, reject) => { - const { socket } = options - const emitArgs = [method, name].concat(args) - - socket.emit(...emitArgs, (error: any, result: any) => (error ? reject(error) : resolve(result))) - }) - } - - const verifyEvent = (done: (err?: any) => void, callback: (data: any) => void) => { - return function (data: any) { - try { - callback(data) - done() - } catch (error: any) { - done(error) - } - } - } - - describe('Basic service events', () => { - let socket: Socket - let connection: RealTimeConnection - - before((done) => { - options.app.once('connection', (conn: RealTimeConnection) => { - connection = conn - - options.app.channel('default').join(connection) - options.app.publish(() => options.app.channel('default')) - done() - }) - socket = io('http://localhost:7886') - }) - - after((done) => { - socket.once('disconnect', () => done()) - socket.disconnect() - }) - - it(`${name} created`, (done) => { - const original = { - name: 'created event' - } - - socket.once( - `${name} created`, - verifyEvent(done, (data) => verify.create(original, data)) - ) - - call('create', original) - }) - - it(`${name} updated`, (done) => { - const original = { - name: 'updated event' - } - - socket.once( - `${name} updated`, - verifyEvent(done, (data: any) => verify.update(10, original, data)) - ) - - call('update', 10, original) - }) - - it(`${name} patched`, (done) => { - const original = { - name: 'patched event' - } - - socket.once( - `${name} patched`, - verifyEvent(done, (data: any) => verify.patch(12, original, data)) - ) - - call('patch', 12, original) - }) - - it(`${name} removed`, (done) => { - socket.once( - `${name} removed`, - verifyEvent(done, (data: any) => verify.remove(333, data)) - ) - - call('remove', 333) - }) - - it(`${name} custom events`, (done) => { - const service = options.app.service(name) - const original = { - name: 'created event' - } - - socket.once( - `${name} log`, - verifyEvent(done, (data: any) => { - assert.deepStrictEqual(data, { - message: 'Custom log event', - data: original - }) - }) - ) - - service.emit('log', { - data: original, - message: 'Custom log event' - }) - }) - }) - - describe('Event channels', () => { - const eventName = `${name} created` - - let connections: RealTimeConnection[] - let sockets: any[] - - before((done) => { - let counter = 0 - const handler = (connection: RealTimeConnection) => { - counter++ - - options.app.channel(connection.channel).join(connection) - - connections.push(connection) - - if (counter === 3) { - done() - options.app.removeListener('connection', handler) - } - } - - connections = [] - sockets = [] - - options.app.on('connection', handler) - - sockets.push( - io('http://localhost:7886', { - query: { channel: 'first' } - }), - - io('http://localhost:7886', { - query: { channel: 'second' } - }), - - io('http://localhost:7886', { - query: { channel: 'second' } - }) - ) - }) - - after(() => { - sockets.forEach((socket) => socket.disconnect()) - }) - - it(`filters '${eventName}' event for a single channel`, (done) => { - const service = options.app.service(name) - const [socket, otherSocket] = sockets - const onError = () => { - done(new Error('Should not get this event')) - } - - service.publish('created', (data: any) => options.app.channel(data.room)) - - socket.once(eventName, (data: any) => { - assert.strictEqual(data.room, 'first') - otherSocket.removeEventListener(eventName, onError) - done() - }) - - otherSocket.once(eventName, onError) - - service.create({ - text: 'Event dispatching test', - room: 'first' - }) - }) - - it(`filters '${name} created' event for a channel with multiple connections`, (done) => { - let counter = 0 - - const service = options.app.service(name) - const [otherSocket, socketOne, socketTwo] = sockets - const onError = () => { - done(new Error('Should not get this event')) - } - const onEvent = (data: any) => { - counter++ - assert.strictEqual(data.room, 'second') - - if (++counter === 2) { - otherSocket.removeEventListener(eventName, onError) - done() - } - } - - service.publish('created', (data: any) => options.app.channel(data.room)) - - socketOne.once(eventName, onEvent) - socketTwo.once(eventName, onEvent) - otherSocket.once(eventName, onError) - - service.create({ - text: 'Event dispatching test', - room: 'second' - }) - }) - }) -} diff --git a/packages/socketio/test/index.test.ts b/packages/socketio/test/index.test.ts deleted file mode 100644 index cff9b4fae7..0000000000 --- a/packages/socketio/test/index.test.ts +++ /dev/null @@ -1,280 +0,0 @@ -import { strict as assert } from 'assert' -import { - feathers, - Application, - HookContext, - NullableId, - Params, - ApplicationHookContext -} from '@feathersjs/feathers' -import express from '@feathersjs/express' -import { Request, Response } from 'express' -import omit from 'lodash/omit' -import extend from 'lodash/extend' -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' - -class VerifierService { - async find(params: Params) { - return { params } - } - - async create(data: any, params: Params) { - return { data, params } - } - - async update(id: NullableId, data: any, params: Params) { - return { id, data, params } - } -} - -describe('@feathersjs/socketio', () => { - let app: Application - let server: Server - let socket: Socket - - const socketParams: any = { - user: { name: 'David' }, - provider: 'socketio' - } - const options = { - get app() { - return app - }, - - get socket() { - return socket - } - } - - before((done) => { - const errorHook = (hook: HookContext) => { - if (hook.params.query.hookError) { - throw new Error(`Error from ${hook.method}, ${hook.type} hook`) - } - } - - app = feathers() - .configure( - socketio((io) => { - io.use(function (socket: FeathersSocket, next: NextFunction) { - socket.feathers!.user = { name: 'David' } - socketParams.headers = socket.feathers!.headers - - const { channel } = socket.handshake.query as any - - if (channel) { - socket.feathers!.channel = channel - } - - next() - }) - }) - ) - .use('/todo', new Service()) - .use('/verify', new VerifierService()) - - app.service('todo').hooks({ - before: { - get: errorHook - } - }) - - app.hooks({ - setup: [ - async (context: ApplicationHookContext, next: NextFunction) => { - assert.notStrictEqual(context.app, undefined) - await next() - } - ] - }) - - app - .listen(7886) - .then((srv) => { - server = srv - server.once('listening', () => { - app.use('/tasks', new Service()) - app.service('tasks').hooks({ - before: { - get: errorHook - } - }) - }) - }) - .catch(done) - - socket = io('http://localhost:7886') - socket.on('connect', () => done()) - }) - - after((done) => { - socket.disconnect() - server.close(done) - }) - - it('runs io before setup (#131)', (done) => { - let counter = 0 - const app = feathers().configure( - socketio(() => { - assert.strictEqual(counter, 0) - counter++ - }) - ) - - app.listen(8887).then((srv) => { - srv.on('listening', () => srv.close(done)) - }) - }) - - it('can set MaxListeners', (done) => { - const app = feathers().configure(socketio((io) => io.sockets.setMaxListeners(100))) - - app.listen(8987).then((srv) => { - srv.on('listening', () => { - assert.strictEqual(app.io.sockets.getMaxListeners(), 100) - srv.close(done) - }) - }) - }) - - it('expressified app works', async () => { - const data = { message: 'Hello world' } - const app = express(feathers()) - .configure(socketio()) - .use('/test', (_req: Request, res: Response) => res.json(data)) - - const srv = await app.listen(8992) - const response = await axios({ - url: 'http://localhost:8992/socket.io/socket.io.js' - }) - - assert.strictEqual(response.status, 200) - - const res = await axios({ - url: 'http://localhost:8992/test' - }) - - assert.deepStrictEqual(res.data, data) - - await new Promise((resolve) => srv.close(() => resolve(srv))) - }) - - it('can set options (#12)', (done) => { - const application = feathers().configure( - socketio( - { - path: '/test/' - }, - (ioInstance) => assert.ok(ioInstance) - ) - ) - - application.listen(8987).then((srv) => { - srv.on('listening', async () => { - const { status } = await axios('http://localhost:8987/test/socket.io.js') - - assert.strictEqual(status, 200) - srv.close(done) - }) - }) - }) - - it('passes handshake as service parameters', (done) => { - socket.emit('create', 'verify', {}, (error: any, data: any) => { - assert.ok(!error) - assert.deepStrictEqual( - omit(data.params, 'query', 'route', 'connection'), - socketParams, - 'Passed handshake parameters' - ) - - socket.emit( - 'update', - 'verify', - 1, - {}, - { - test: 'param' - }, - (error: any, data: any) => { - assert.ok(!error) - assert.deepStrictEqual( - data.params, - extend( - { - route: {}, - connection: socketParams, - query: { - test: 'param' - } - }, - socketParams - ), - 'Passed handshake parameters as query' - ) - done() - } - ) - }) - }) - - it('connection and disconnect events (#1243, #1238)', (done) => { - const mySocket = io('http://localhost:7886?channel=dctest') - - app.once('connection', (connection) => { - assert.strictEqual(connection.channel, 'dctest') - app.once('disconnect', (disconnection) => { - assert.strictEqual(disconnection.channel, 'dctest') - done() - }) - setTimeout(() => mySocket.close(), 100) - }) - - assert.ok(mySocket) - }) - - it('app `disconnect` event disconnects socket (#2754)', (done) => { - const mySocket = io('http://localhost:7886?channel=dctest') - - app.once('connection', (connection) => { - assert.strictEqual(connection.channel, 'dctest') - mySocket.once('disconnect', () => done()) - app.emit('disconnect', connection) - }) - - assert.ok(mySocket) - }) - - it('missing parameters in socket call works (#88)', (done) => { - socket.emit('find', 'verify', (error: any, data: any) => { - assert.ok(!error) - assert.deepStrictEqual( - omit(data.params, 'query', 'route', 'connection'), - socketParams, - 'Handshake parameters passed on proper position' - ) - done() - }) - }) - - describe('Service method calls', () => { - describe("('method', 'service') event format", () => { - describe('Service', () => methodTests('todo', options)) - describe('Dynamic Service', () => methodTests('todo', options)) - }) - }) - - describe('Service events', () => { - describe('Service', () => eventTests('todo', options)) - describe('Dynamic Service', () => eventTests('tasks', options)) - }) -}) diff --git a/packages/socketio/test/methods.ts b/packages/socketio/test/methods.ts deleted file mode 100644 index e376682256..0000000000 --- a/packages/socketio/test/methods.ts +++ /dev/null @@ -1,128 +0,0 @@ -import { strict as assert } from 'assert' -import { verify } from '@feathersjs/tests' - -export default (name: string, options: any) => { - const call = (method: string, ...args: any[]) => - new Promise((resolve, reject) => { - const { socket } = options - const prefix = [method, name] - const emitArgs = prefix.concat(args) - - socket.emit(...emitArgs, (error: any, result: any) => (error ? reject(error) : resolve(result))) - }) - - it('invalid arguments cause an error', async () => { - await assert.rejects(() => call('find', 1, {}), { - message: "Too many arguments for 'find' method" - }) - }) - - it('.find', () => async () => { - await call('find', {}).then((data) => verify.find(data)) - }) - - it('.get', () => async () => { - await call('get', 'laundry').then((data) => verify.get('laundry', data)) - }) - - it('.get with error', () => async () => { - try { - await call('get', 'laundry', { error: true }) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.message, 'Something for laundry went wrong') - } - }) - - it('.get with runtime error', () => async () => { - try { - await call('get', 'laundry', { runtimeError: true }) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.message, 'thingThatDoesNotExist is not defined') - } - }) - - it('.get with error in hook', () => async () => { - try { - await call('get', 'laundry', { hookError: true }) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.message, 'Error from get, before hook') - } - }) - - it('.create', async () => { - const original = { - name: 'creating' - } - - const data = await call('create', original, {}) - - verify.create(original, data) - }) - - it('.create without parameters', async () => { - const original = { - name: 'creating again' - } - - const data = await call('create', original) - - verify.create(original, data) - }) - - it('.update', async () => { - const original = { - name: 'updating' - } - - const data = await call('update', 23, original, {}) - - verify.update(23, original, data) - }) - - it('.update many', async () => { - const original = { - name: 'updating', - many: true - } - - const data = await call('update', null, original) - - verify.update(null, original, data) - }) - - it('.patch', async () => { - const original = { - name: 'patching' - } - - const data = await call('patch', 25, original) - - verify.patch(25, original, data) - }) - - it('.patch many', async () => { - const original = { - name: 'patching', - many: true - } - - const data = await call('patch', null, original) - - verify.patch(null, original, data) - }) - - it('.remove', () => async () => { - const data = await call('remove', 11) - - verify.remove(11, data) - }) - - it('.remove many', async () => { - const data = await call('remove', null) - - verify.remove(null, data) - }) -} diff --git a/packages/socketio/tsconfig.json b/packages/socketio/tsconfig.json deleted file mode 100644 index 316fd41336..0000000000 --- a/packages/socketio/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig", - "include": [ - "src/**/*.ts" - ], - "compilerOptions": { - "outDir": "lib" - } -} diff --git a/packages/tests/CHANGELOG.md b/packages/tests/CHANGELOG.md deleted file mode 100644 index 485128356d..0000000000 --- a/packages/tests/CHANGELOG.md +++ /dev/null @@ -1,467 +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.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/tests - -## [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/tests - -## [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/tests - -## [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/tests - -## [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/tests - -## [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/tests - -## [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/tests - -## [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/tests - -## [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/tests - -## [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/tests - -## [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/tests - -## [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/tests - -## [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/tests - -## [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/tests - -## [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/tests - -## [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/tests - -## [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/tests - -## [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/tests - -## [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/tests - -## [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/tests - -## [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/tests - -## [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/tests - -## [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/tests - -## [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/tests - -## [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/tests - -## [5.0.4](https://github.com/feathersjs/feathers/compare/v5.0.3...v5.0.4) (2023-04-12) - -**Note:** Version bump only for package @feathersjs/tests - -## [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/tests - -# [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/tests - -# [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/tests - -# [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/tests - -# [5.0.0-pre.36](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.35...v5.0.0-pre.36) (2023-01-29) - -### Bug Fixes - -- Update all dependencies ([#3024](https://github.com/feathersjs/feathers/issues/3024)) ([283dc47](https://github.com/feathersjs/feathers/commit/283dc4798d85584bc031e6e54b83b4ea77d1edd0)) - -# [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 @feathersjs/tests - -# [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/tests - -# [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/tests - -# [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/tests - -# [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 @feathersjs/tests - -# [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/tests - -# [5.0.0-pre.28](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.27...v5.0.0-pre.28) (2022-08-03) - -**Note:** Version bump only for package @feathersjs/tests - -# [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/tests - -# [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/tests - -# [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/tests - -# [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/tests - -# [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/tests - -# [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/tests - -# [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/tests - -# [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/tests - -# [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/tests - -# [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/tests - -# [5.0.0-pre.16](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.15...v5.0.0-pre.16) (2022-01-12) - -### Features - -- **express, koa:** make transports similar ([#2486](https://github.com/feathersjs/feathers/issues/2486)) ([26aa937](https://github.com/feathersjs/feathers/commit/26aa937c114fb8596dfefc599b1f53cead69c159)) - -# [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/tests - -# [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/tests - -# [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/tests - -# [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/tests - -# [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/tests - -# [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/tests - -# [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/tests - -# [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/tests - -# [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/tests - -# [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/tests - -# [5.0.0-pre.5](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.4...v5.0.0-pre.5) (2021-06-23) - -### Bug Fixes - -- **koa:** Use extended query parser for compatibility ([#2397](https://github.com/feathersjs/feathers/issues/2397)) ([b2944ba](https://github.com/feathersjs/feathers/commit/b2944bac3ec6d5ecc80dc518cd4e58093692db74)) - -# [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/tests - -# [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/tests - -# [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/tests - -# [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)) - -### Features - -- **core:** Public custom service methods ([#2270](https://github.com/feathersjs/feathers/issues/2270)) ([e65abfb](https://github.com/feathersjs/feathers/commit/e65abfb5388df6c19a11c565cf1076a29f32668d)) -- Feathers v5 core refactoring and features ([#2255](https://github.com/feathersjs/feathers/issues/2255)) ([2dafb7c](https://github.com/feathersjs/feathers/commit/2dafb7ce14ba57406aeec13d10ca45b1e709bee9)) - -# [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) - -**Note:** Version bump only for package @feathersjs/tests - -# [5.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v4.5.4...v5.0.0-pre.0) (2020-05-19) - -## [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/tests - -## [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/tests - -## [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/tests - -## [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/tests - -## [4.5.8](https://github.com/feathersjs/feathers/compare/v4.5.7...v4.5.8) (2020-08-12) - -## [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/tests - -## [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/tests - -## [4.5.3](https://github.com/feathersjs/feathers/compare/v4.5.2...v4.5.3) (2020-04-17) - -**Note:** Version bump only for package @feathersjs/tests - -## [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/tests - -## [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/tests - -# [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/tests - -## [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/tests - -## [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/tests - -# [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/tests - -## [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/tests - -## [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/tests - -## [4.3.9](https://github.com/feathersjs/feathers/compare/v4.3.8...v4.3.9) (2019-10-26) - -**Note:** Version bump only for package @feathersjs/tests - -## [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/tests - -## [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/tests - -## [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/tests - -## [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/tests - -## [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/tests - -# [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/tests - -# [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/tests - -# [4.3.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.2...v4.3.0-pre.3) (2019-08-19) - -### Bug Fixes - -- Update all dependencies ([7d53a00](https://github.com/feathersjs/feathers/commit/7d53a00)) - -# [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/tests - -# [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/tests - -# [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/tests - -# [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/tests - -# [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) - -**Note:** Version bump only for package @feathersjs/tests - -# [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 - -- Improve authentication parameter handling ([#1333](https://github.com/feathersjs/feathers/issues/1333)) ([6e77204](https://github.com/feathersjs/feathers/commit/6e77204)) diff --git a/packages/tests/LICENSE b/packages/tests/LICENSE deleted file mode 100644 index 7712f870f3..0000000000 --- a/packages/tests/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2024 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 -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -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/README.md b/packages/tests/README.md deleted file mode 100644 index f5018f2898..0000000000 --- a/packages/tests/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# @feathersjs/tests - -[![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/tests.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/tests) - -> Common tests for Feathers core modules diff --git a/packages/tests/package.json b/packages/tests/package.json deleted file mode 100644 index b4ee830791..0000000000 --- a/packages/tests/package.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "name": "@feathersjs/tests", - "private": true, - "description": "Feathers core module common tests", - "version": "5.0.34", - "homepage": "https://feathersjs.com", - "main": "lib/", - "types": "lib/", - "keywords": [ - "feathers" - ], - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/daffl" - }, - "repository": { - "type": "git", - "url": "git://github.com/feathersjs/feathers.git", - "directory": "packages/tests" - }, - "author": { - "name": "Feathers contributors", - "email": "hello@feathersjs.com", - "url": "https://feathersjs.com" - }, - "contributors": [], - "bugs": { - "url": "https://github.com/feathersjs/feathers/issues" - }, - "engines": { - "node": ">= 12" - }, - "scripts": { - "prepublish": "npm run compile", - "pack": "echo \"not necessary\"", - "test": "echo \"not necessary\"", - "compile": "shx rm -rf lib/ && tsc" - }, - "directories": { - "lib": "lib" - }, - "publishConfig": { - "access": "public" - }, - "dependencies": { - "@types/lodash": "^4.17.20", - "axios": "^1.11.0", - "lodash": "^4.17.21" - }, - "devDependencies": { - "@feathersjs/feathers": "^5.0.34", - "@types/mocha": "^10.0.10", - "@types/node": "^24.1.0", - "mocha": "^11.7.1", - "shx": "^0.4.0", - "ts-node": "^10.9.2", - "typescript": "^5.9.2" - } -} diff --git a/packages/tests/resources/certificate.pem b/packages/tests/resources/certificate.pem deleted file mode 100644 index 6735645071..0000000000 --- a/packages/tests/resources/certificate.pem +++ /dev/null @@ -1,16 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICmzCCAgQCCQDugFqITnU/sDANBgkqhkiG9w0BAQUFADCBkTELMAkGA1UEBhMC -Q0ExEDAOBgNVBAgTB0FsYmVydGExEDAOBgNVBAcTB0NhbGdhcnkxETAPBgNVBAoT -CEZlYXRoZXJzMREwDwYDVQQLEwhGZWF0aGVyczETMBEGA1UEAxMKRmVhdGhlcnNK -UzEjMCEGCSqGSIb3DQEJARYUaGVsbG9AZmVhdGhlcnNqcy5jb20wHhcNMTQwMTA0 -MDIwNTUyWhcNMTQwMjAzMDIwNTUyWjCBkTELMAkGA1UEBhMCQ0ExEDAOBgNVBAgT -B0FsYmVydGExEDAOBgNVBAcTB0NhbGdhcnkxETAPBgNVBAoTCEZlYXRoZXJzMREw -DwYDVQQLEwhGZWF0aGVyczETMBEGA1UEAxMKRmVhdGhlcnNKUzEjMCEGCSqGSIb3 -DQEJARYUaGVsbG9AZmVhdGhlcnNqcy5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0A -MIGJAoGBALixfLwrvDDYAaaU62oycz8zwUpxCguyyXyhVDN/KMmP/I+HfkbcIrqj -tW0jbpRWiLhn5cw4K/cUTkfMj4AwaN5t2zq0FVFJdIddLxzuamyJLJFZfs5sPYWt -X6morPcu9RM7jwb3R1V852XjVWUj8neUAu7eUzKoSQ575kHsnKrdAgMBAAEwDQYJ -KoZIhvcNAQEFBQADgYEATVlxNPkSgkqBF4foUYNGnkvaiwhd88Mh/Ya3T3EnknF9 -Gz6KrlwWDDI8MkPmqabT2Ijg3LSec7WV+C8SETVFbWLOGV6N1ZVfodFzJ7EKMz5e -VvEIKnHfHpYOEa21E5u02+OfKahtW37eTEVmvcV67vYmW4HNa5QSZ5qfrrqcUhc= ------END CERTIFICATE----- diff --git a/packages/tests/resources/certrequest.csr b/packages/tests/resources/certrequest.csr deleted file mode 100644 index 41f83b2757..0000000000 --- a/packages/tests/resources/certrequest.csr +++ /dev/null @@ -1,12 +0,0 @@ ------BEGIN CERTIFICATE REQUEST----- -MIIB0jCCATsCAQAwgZExCzAJBgNVBAYTAkNBMRAwDgYDVQQIEwdBbGJlcnRhMRAw -DgYDVQQHEwdDYWxnYXJ5MREwDwYDVQQKEwhGZWF0aGVyczERMA8GA1UECxMIRmVh -dGhlcnMxEzARBgNVBAMTCkZlYXRoZXJzSlMxIzAhBgkqhkiG9w0BCQEWFGhlbGxv -QGZlYXRoZXJzanMuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC4sXy8 -K7ww2AGmlOtqMnM/M8FKcQoLssl8oVQzfyjJj/yPh35G3CK6o7VtI26UVoi4Z+XM -OCv3FE5HzI+AMGjebds6tBVRSXSHXS8c7mpsiSyRWX7ObD2FrV+pqKz3LvUTO48G -90dVfOdl41VlI/J3lALu3lMyqEkOe+ZB7Jyq3QIDAQABoAAwDQYJKoZIhvcNAQEF -BQADgYEAFN1xm2Jc5EwDsiJwjUQkVCYLfAPz8FxLx8XCY7JugPCZWxeJ3w9C3Ymz -hET//7uxNg6q7EO9CI33vP5eOdI8oC8XQffh4GzCoSrmGrKpHSqVh3zN/rCoB4BY -f4nJofTka5iENjMdA0R8//Wp7F1u7xhriuxaRiZoFEPaCIsrvK4= ------END CERTIFICATE REQUEST----- diff --git a/packages/tests/resources/privatekey.pem b/packages/tests/resources/privatekey.pem deleted file mode 100644 index 3a39a23926..0000000000 --- a/packages/tests/resources/privatekey.pem +++ /dev/null @@ -1,15 +0,0 @@ ------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----- diff --git a/packages/tests/src/client.ts b/packages/tests/src/client.ts deleted file mode 100644 index 5d18a2243f..0000000000 --- a/packages/tests/src/client.ts +++ /dev/null @@ -1,121 +0,0 @@ -import { strict as assert } from 'assert' - -export interface Todo { - text: string - complete?: boolean - id?: number -} - -export function clientTests(app: any, name: string) { - const getService = () => (name && typeof app.service === 'function' ? app.service(name) : app) - - describe('Service base tests', () => { - it('.find', async () => { - const todos = await getService().find() - - assert.deepEqual(todos, [ - { - // eslint-disable-line - text: 'some todo', - complete: false, - id: 0 - } - ]) - }) - - it('.get and params passing', async () => { - const query = { - some: 'thing', - other: ['one', 'two'], - nested: { a: { b: 'object' } } - } - - const todo = await getService().get(0, { query }) - - assert.deepEqual(todo, { - // eslint-disable-line - id: 0, - text: 'some todo', - complete: false, - query - }) - }) - - it('.create', async () => { - const todo = await getService().create({ - text: 'created todo', - complete: true - }) - - assert.deepEqual(todo, { - // eslint-disable-line - id: 1, - text: 'created todo', - complete: true - }) - }) - - it('.create and created event', (done) => { - getService().once('created', (data: Todo) => { - assert.strictEqual(data.text, 'created todo') - assert.ok(data.complete) - done() - }) - - getService().create({ text: 'created todo', complete: true }) - }) - - it('.update and updated event', (done) => { - getService().once('updated', (data: Todo) => { - assert.strictEqual(data.text, 'updated todo') - assert.ok(data.complete) - done() - }) - - getService() - .create({ text: 'todo to update', complete: false }) - .then((todo: Todo) => { - getService().update(todo.id, { - text: 'updated todo', - complete: true - }) - }) - }) - - it('.patch and patched event', (done) => { - getService().once('patched', (data: Todo) => { - assert.strictEqual(data.text, 'todo to patch') - assert.ok(data.complete) - done() - }) - - getService() - .create({ text: 'todo to patch', complete: false }) - .then((todo: Todo) => getService().patch(todo.id, { complete: true })) - }) - - it('.remove and removed event', (done) => { - getService().once('removed', (data: Todo) => { - assert.strictEqual(data.text, 'todo to remove') - assert.strictEqual(data.complete, false) - done() - }) - - getService() - .create({ text: 'todo to remove', complete: false }) - .then((todo: Todo) => getService().remove(todo.id)) - .catch(done) - }) - - it('.get with error', async () => { - const query = { error: true } - - try { - await getService().get(0, { query }) - assert.fail('Should never get here') - } catch (error: any) { - assert.strictEqual(error.message, 'Something went wrong') - } - }) - }) -} diff --git a/packages/tests/src/index.ts b/packages/tests/src/index.ts deleted file mode 100644 index 214319e144..0000000000 --- a/packages/tests/src/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './client' -export * from './rest' -export * from './fixture' diff --git a/packages/tests/src/rest.ts b/packages/tests/src/rest.ts deleted file mode 100644 index 78149ba366..0000000000 --- a/packages/tests/src/rest.ts +++ /dev/null @@ -1,94 +0,0 @@ -import assert from 'assert' -import axios from 'axios' - -import { verify } from './fixture' - -export function restTests(description: string, name: string, port: number) { - describe(description, () => { - it('GET .find', async () => { - const res = await axios.get(`http://localhost:${port}/${name}`) - - assert.ok(res.status === 200, 'Got OK status code') - verify.find(res.data) - }) - - it('GET .get', async () => { - const res = await axios.get(`http://localhost:${port}/${name}/dishes`) - - assert.ok(res.status === 200, 'Got OK status code') - verify.get('dishes', res.data) - }) - - it('POST .create', async () => { - const original = { - description: 'POST .create' - } - - const res = await axios.post(`http://localhost:${port}/${name}`, original) - - assert.ok(res.status === 201, 'Got CREATED status code') - verify.create(original, res.data) - }) - - it('PUT .update', async () => { - const original = { - description: 'PUT .update' - } - - const res = await axios.put(`http://localhost:${port}/${name}/544`, original) - - assert.ok(res.status === 200, 'Got OK status code') - verify.update('544', original, res.data) - }) - - it('PUT .update many', async () => { - const original = { - description: 'PUT .update', - many: true - } - - const res = await axios.put(`http://localhost:${port}/${name}`, original) - const { data } = res - - assert.ok(res.status === 200, 'Got OK status code') - verify.update(null, original, data) - }) - - it('PATCH .patch', async () => { - const original = { - description: 'PATCH .patch' - } - - const res = await axios.patch(`http://localhost:${port}/${name}/544`, original) - - assert.ok(res.status === 200, 'Got OK status code') - verify.patch('544', original, res.data) - }) - - it('PATCH .patch many', async () => { - const original = { - description: 'PATCH .patch', - many: true - } - - const res = await axios.patch(`http://localhost:${port}/${name}`, original) - - assert.ok(res.status === 200, 'Got OK status code') - verify.patch(null, original, res.data) - }) - - it('DELETE .remove', async () => { - const res = await axios.delete(`http://localhost:${port}/${name}/233`) - - assert.ok(res.status === 200, 'Got OK status code') - verify.remove('233', res.data) - }) - - it('DELETE .remove many', async () => { - const res = await axios.delete(`http://localhost:${port}/${name}`) - - assert.ok(res.status === 200, 'Got OK status code') - verify.remove(null, res.data) - }) - }) -} diff --git a/packages/tests/tsconfig.json b/packages/tests/tsconfig.json deleted file mode 100644 index 316fd41336..0000000000 --- a/packages/tests/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig", - "include": [ - "src/**/*.ts" - ], - "compilerOptions": { - "outDir": "lib" - } -} diff --git a/packages/transport-commons/CHANGELOG.md b/packages/transport-commons/CHANGELOG.md deleted file mode 100644 index 8b4f0ad42f..0000000000 --- a/packages/transport-commons/CHANGELOG.md +++ /dev/null @@ -1,962 +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.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/transport-commons - -## [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/transport-commons - -## [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/transport-commons - -## [5.0.28](https://github.com/feathersjs/feathers/compare/v5.0.27...v5.0.28) (2024-07-10) - -### Bug Fixes - -- **transport-commons:** Fix HTTP status precedence ([#3511](https://github.com/feathersjs/feathers/issues/3511)) ([5d999a0](https://github.com/feathersjs/feathers/commit/5d999a0acddc0cb7692058209dfbc62673ab5a69)) - -## [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/transport-commons - -## [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/transport-commons - -## [5.0.25](https://github.com/feathersjs/feathers/compare/v5.0.24...v5.0.25) (2024-05-03) - -### Bug Fixes - -- Reduce usage of lodash ([#3455](https://github.com/feathersjs/feathers/issues/3455)) ([8ce807a](https://github.com/feathersjs/feathers/commit/8ce807a5ca53ff5b8d5107a0656c6329404e6e6c)) - -## [5.0.24](https://github.com/feathersjs/feathers/compare/v5.0.23...v5.0.24) (2024-03-13) - -### Bug Fixes - -- **socketio:** Handle ackTimeout of socket.io ([#3437](https://github.com/feathersjs/feathers/issues/3437)) ([2642072](https://github.com/feathersjs/feathers/commit/26420721f3eb16f716a9e68ab3ed9f415bab7a9c)) - -## [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)) -- **transport-commons:** Properly delete route data ([#3433](https://github.com/feathersjs/feathers/issues/3433)) ([af01bdb](https://github.com/feathersjs/feathers/commit/af01bdbe050dd428d6fffefa1874e9a6e4182bad)) - -## [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/transport-commons - -## [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/transport-commons - -## [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/transport-commons - -## [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/transport-commons - -## [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/transport-commons - -## [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/transport-commons - -## [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/transport-commons - -## [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/transport-commons - -## [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/transport-commons - -## [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/transport-commons - -## [5.0.12](https://github.com/feathersjs/feathers/compare/v5.0.11...v5.0.12) (2023-11-28) - -### Bug Fixes - -- **transport-commons:** Allow case insensitive route lookups ([#3353](https://github.com/feathersjs/feathers/issues/3353)) ([a4a5ab6](https://github.com/feathersjs/feathers/commit/a4a5ab6cb59048176292cd71c04a32aa71ac4642)) - -## [5.0.11](https://github.com/feathersjs/feathers/compare/v5.0.10...v5.0.11) (2023-10-11) - -### Bug Fixes - -- **client:** Replace placeholders in URL with route params ([#3270](https://github.com/feathersjs/feathers/issues/3270)) ([a0624eb](https://github.com/feathersjs/feathers/commit/a0624eb5a7919aa1b179a71beb1c1b9cab574525)) -- **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/transport-commons - -## [5.0.9](https://github.com/feathersjs/feathers/compare/v5.0.8...v5.0.9) (2023-09-27) - -### Bug Fixes - -- **client:** Add underscored methods to clients ([#3176](https://github.com/feathersjs/feathers/issues/3176)) ([f3c01f7](https://github.com/feathersjs/feathers/commit/f3c01f7b8266bfc642c55b77ba8e5bb333542630)) - -## [5.0.8](https://github.com/feathersjs/feathers/compare/v5.0.7...v5.0.8) (2023-07-19) - -### Bug Fixes - -- **transport-commons:** Handle invalid service paths on socket lookups ([#3241](https://github.com/feathersjs/feathers/issues/3241)) ([c397ab3](https://github.com/feathersjs/feathers/commit/c397ab3a0cd184044ae4f73540549b30a396821c)) - -## [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/transport-commons - -## [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/transport-commons - -## [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/transport-commons - -## [5.0.4](https://github.com/feathersjs/feathers/compare/v5.0.3...v5.0.4) (2023-04-12) - -**Note:** Version bump only for package @feathersjs/transport-commons - -## [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) - -### Bug Fixes - -- **core:** Use Symbol.for to instantiate shared symbols ([#3087](https://github.com/feathersjs/feathers/issues/3087)) ([7f3fc21](https://github.com/feathersjs/feathers/commit/7f3fc2167576f228f8183568eb52b077160e8d65)) -- **transport-commons:** Fix dispatching of arrays ([#3075](https://github.com/feathersjs/feathers/issues/3075)) ([98fdda5](https://github.com/feathersjs/feathers/commit/98fdda53187acee88137b39662c766cc62cd7b55)) - -# [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/transport-commons - -# [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/transport-commons - -# [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/transport-commons - -# [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/transport-commons - -# [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) - -### Bug Fixes - -- **core:** Improve service option usage and method option typings ([#2902](https://github.com/feathersjs/feathers/issues/2902)) ([164d75c](https://github.com/feathersjs/feathers/commit/164d75c0f11139a316baa91f1762de8f8eb7da2d)) - -# [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/transport-commons - -# [5.0.0-pre.32](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.31...v5.0.0-pre.32) (2022-10-26) - -### Bug Fixes - -- **docs:** Review transport API docs and update Express middleware setup ([#2811](https://github.com/feathersjs/feathers/issues/2811)) ([1b97f14](https://github.com/feathersjs/feathers/commit/1b97f14d474f5613482f259eeaa585c24fcfab43)) - -# [5.0.0-pre.31](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.30...v5.0.0-pre.31) (2022-10-12) - -### Features - -- **cli:** Generate full client test suite and improve typed client ([#2788](https://github.com/feathersjs/feathers/issues/2788)) ([57119b6](https://github.com/feathersjs/feathers/commit/57119b6bb2797f7297cf054268a248c093ecd538)) - -# [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/transport-commons - -# [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) - -### Bug Fixes - -- **socketio-client:** Make Socket.io client event target compatible ([#2686](https://github.com/feathersjs/feathers/issues/2686)) ([716c49a](https://github.com/feathersjs/feathers/commit/716c49a270e4be5e5276192092c292f72ffcfa19)) - -# [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/transport-commons - -# [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/transport-commons - -# [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/transport-commons - -# [5.0.0-pre.23](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.22...v5.0.0-pre.23) (2022-06-06) - -### Features - -- **client:** Improve client side custom method support ([#2654](https://github.com/feathersjs/feathers/issues/2654)) ([c138acf](https://github.com/feathersjs/feathers/commit/c138acf50affbe6b66177d084d3c7a3e9220f09f)) - -# [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/transport-commons - -# [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/transport-commons - -# [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) - -### Bug Fixes - -- **transport-commons:** Ensure socket queries are always plain objects ([#2597](https://github.com/feathersjs/feathers/issues/2597)) ([97313e1](https://github.com/feathersjs/feathers/commit/97313e121cfee4199f10012e95b8507557aa507e)) - -# [5.0.0-pre.18](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.17...v5.0.0-pre.18) (2022-04-11) - -### Features - -- **transport-commons:** add `context.http.response` ([#2524](https://github.com/feathersjs/feathers/issues/2524)) ([5bc9d44](https://github.com/feathersjs/feathers/commit/5bc9d447043c2e2b742c73ed28ecf3b3264dd9e5)) - -# [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/transport-commons - -# [5.0.0-pre.16](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.15...v5.0.0-pre.16) (2022-01-12) - -### Features - -- **express, koa:** make transports similar ([#2486](https://github.com/feathersjs/feathers/issues/2486)) ([26aa937](https://github.com/feathersjs/feathers/commit/26aa937c114fb8596dfefc599b1f53cead69c159)) - -# [5.0.0-pre.15](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.14...v5.0.0-pre.15) (2021-11-27) - -### Bug Fixes - -- **typescript:** Overall typing improvements ([#2478](https://github.com/feathersjs/feathers/issues/2478)) ([b8eb804](https://github.com/feathersjs/feathers/commit/b8eb804158556d9651a8607e3c3fda15e0bfd110)) - -### Features - -- **core:** add `context.http` and move `statusCode` there ([#2496](https://github.com/feathersjs/feathers/issues/2496)) ([b701bf7](https://github.com/feathersjs/feathers/commit/b701bf77fb83048aa1dffa492b3d77dd53f7b72b)) -- **transport-commons:** Ability to register routes with custom params ([#2482](https://github.com/feathersjs/feathers/issues/2482)) ([497990a](https://github.com/feathersjs/feathers/commit/497990ae4a980e5a52a1f0f932db12cd0e6e254a)) - -# [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/transport-commons - -# [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/transport-commons - -# [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/transport-commons - -# [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/transport-commons - -# [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/transport-commons - -# [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/transport-commons - -# [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/transport-commons - -# [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/transport-commons - -# [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/transport-commons - -# [5.0.0-pre.5](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.4...v5.0.0-pre.5) (2021-06-23) - -### Bug Fixes - -- **koa:** Use extended query parser for compatibility ([#2397](https://github.com/feathersjs/feathers/issues/2397)) ([b2944ba](https://github.com/feathersjs/feathers/commit/b2944bac3ec6d5ecc80dc518cd4e58093692db74)) - -# [5.0.0-pre.4](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.3...v5.0.0-pre.4) (2021-05-13) - -### Bug Fixes - -- **transport-commons:** Fix route placeholder registration and improve radix router performance ([#2336](https://github.com/feathersjs/feathers/issues/2336)) ([4d84dfd](https://github.com/feathersjs/feathers/commit/4d84dfd092ce0510312e975d5cd57e04973fb311)) - -### Features - -- **koa:** KoaJS transport adapter ([#2315](https://github.com/feathersjs/feathers/issues/2315)) ([2554b57](https://github.com/feathersjs/feathers/commit/2554b57cf05731df58feeba9c12faab18e442107)) - -# [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)) - -### Features - -- **dependencies:** Remove direct debug dependency ([#2296](https://github.com/feathersjs/feathers/issues/2296)) ([501d416](https://github.com/feathersjs/feathers/commit/501d4164d30c6a126906dc640cdfdc82207ba34a)) - -# [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/transport-commons - -# [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/transport-commons - -# [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 - -- **transport-commons:** Do not error when adding an undefined connection to a channel ([#2268](https://github.com/feathersjs/feathers/issues/2268)) ([28114c4](https://github.com/feathersjs/feathers/commit/28114c495d6564868bb3ffbf619bf80b774dce4b)) -- Update Grant usage and other dependencies ([#2264](https://github.com/feathersjs/feathers/issues/2264)) ([7b0f8fa](https://github.com/feathersjs/feathers/commit/7b0f8fad252419ed0ad0bf259cdf3104d322ab60)) -- **socketio-client:** Fix client transport-commons reference ([#2164](https://github.com/feathersjs/feathers/issues/2164)) ([3a42c54](https://github.com/feathersjs/feathers/commit/3a42c544058456b19c7e21827226541bfa6ad621)) - -### Features - -- **core:** Public custom service methods ([#2270](https://github.com/feathersjs/feathers/issues/2270)) ([e65abfb](https://github.com/feathersjs/feathers/commit/e65abfb5388df6c19a11c565cf1076a29f32668d)) -- Application service types default to any ([#1566](https://github.com/feathersjs/feathers/issues/1566)) ([d93ba9a](https://github.com/feathersjs/feathers/commit/d93ba9a17edd20d3397bb00f4f6e82e804e42ed6)) -- Feathers v5 core refactoring and features ([#2255](https://github.com/feathersjs/feathers/issues/2255)) ([2dafb7c](https://github.com/feathersjs/feathers/commit/2dafb7ce14ba57406aeec13d10ca45b1e709bee9)) -- **transport-commons:** New built-in high performance radix router ([#2177](https://github.com/feathersjs/feathers/issues/2177)) ([6d18065](https://github.com/feathersjs/feathers/commit/6d180651b4eb40289ecea3df3575f207aa6c5d1f)) - -# [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) - -### Features - -- **core:** use @feathers/hooks and add async type ([#1929](https://github.com/feathersjs/feathers/issues/1929)) ([a5c4756](https://github.com/feathersjs/feathers/commit/a5c47562eae8410c82fe2f6308f26f8e78b6a3e8)) -- **transport-commons:** Remove legacy message format and unnecessary client timeouts ([#1939](https://github.com/feathersjs/feathers/issues/1939)) ([5538881](https://github.com/feathersjs/feathers/commit/5538881a08bc130de42c5984055729d8336f8615)) - -### BREAKING CHANGES - -- **transport-commons:** Removes the old message format and client service timeout - -# [5.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v4.5.4...v5.0.0-pre.0) (2020-05-19) - -### Features - -- **core:** use @feathers/hooks and add async type ([#1929](https://github.com/feathersjs/feathers/issues/1929)) ([a5c4756](https://github.com/feathersjs/feathers/commit/a5c47562eae8410c82fe2f6308f26f8e78b6a3e8)) -- **transport-commons:** Remove legacy message format and unnecessary client timeouts ([#1939](https://github.com/feathersjs/feathers/issues/1939)) ([5538881](https://github.com/feathersjs/feathers/commit/5538881a08bc130de42c5984055729d8336f8615)) - -### BREAKING CHANGES - -- **transport-commons:** Removes the old message format and client service timeout - -## [4.5.11](https://github.com/feathersjs/feathers/compare/v4.5.10...v4.5.11) (2020-12-05) - -### Bug Fixes - -- **socketio-client:** Throw an error and show a warning if someone tries to use socket.io-client v3 ([#2135](https://github.com/feathersjs/feathers/issues/2135)) ([cc3521c](https://github.com/feathersjs/feathers/commit/cc3521c935a1cbd690e29b7057998e3898f282db)) - -## [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/transport-commons - -## [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/transport-commons - -## [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/transport-commons - -## [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/transport-commons - -## [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/transport-commons - -## [4.5.3](https://github.com/feathersjs/feathers/compare/v4.5.2...v4.5.3) (2020-04-17) - -**Note:** Version bump only for package @feathersjs/transport-commons - -## [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/transport-commons - -## [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/transport-commons - -# [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/transport-commons - -## [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/transport-commons - -## [4.4.1](https://github.com/feathersjs/feathers/compare/v4.4.0...v4.4.1) (2019-11-27) - -### Bug Fixes - -- Gracefully handle errors in publishers ([#1710](https://github.com/feathersjs/feathers/issues/1710)) ([0616306](https://github.com/feathersjs/feathers/commit/061630696762e9dbf1dc4e738094992ba16989fc)) - -# [4.4.0](https://github.com/feathersjs/feathers/compare/v4.3.11...v4.4.0) (2019-11-27) - -### Bug Fixes - -- **transport-commons:** Allow to properly chain SocketIo client.off ([#1706](https://github.com/feathersjs/feathers/issues/1706)) ([a4aecbc](https://github.com/feathersjs/feathers/commit/a4aecbcd3578c1cf4ecffb3a58fb6d26e15ee513)) - -## [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/transport-commons - -## [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/transport-commons - -## [4.3.9](https://github.com/feathersjs/feathers/compare/v4.3.8...v4.3.9) (2019-10-26) - -**Note:** Version bump only for package @feathersjs/transport-commons - -## [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/transport-commons - -## [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/transport-commons - -## [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/transport-commons - -## [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/transport-commons - -## [4.3.1](https://github.com/feathersjs/feathers/compare/v4.3.0...v4.3.1) (2019-09-09) - -### Bug Fixes - -- Fix regression in transport commons ([#1551](https://github.com/feathersjs/feathers/issues/1551)) ([ed9e934](https://github.com/feathersjs/feathers/commit/ed9e934)) - -# [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/transport-commons - -# [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/transport-commons - -# [4.3.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.2...v4.3.0-pre.3) (2019-08-19) - -### Bug Fixes - -- Expire and remove authenticated real-time connections ([#1512](https://github.com/feathersjs/feathers/issues/1512)) ([2707c33](https://github.com/feathersjs/feathers/commit/2707c33)) -- Update all dependencies ([7d53a00](https://github.com/feathersjs/feathers/commit/7d53a00)) -- Use WeakMap to connect socket to connection ([#1509](https://github.com/feathersjs/feathers/issues/1509)) ([64807e3](https://github.com/feathersjs/feathers/commit/64807e3)) - -# [4.3.0-pre.2](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.1...v4.3.0-pre.2) (2019-08-02) - -### Bug Fixes - -- Add getEntityId to JWT strategy and fix legacy Socket authentication ([#1488](https://github.com/feathersjs/feathers/issues/1488)) ([9a3b324](https://github.com/feathersjs/feathers/commit/9a3b324)) -- Improve Params typing ([#1474](https://github.com/feathersjs/feathers/issues/1474)) ([54a3aa7](https://github.com/feathersjs/feathers/commit/54a3aa7)) - -# [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/transport-commons - -# [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/transport-commons - -# [4.0.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.3...v4.0.0-pre.4) (2019-07-05) - -### Bug Fixes - -- Clean up hooks code ([#1407](https://github.com/feathersjs/feathers/issues/1407)) ([f25c88b](https://github.com/feathersjs/feathers/commit/f25c88b)) -- Improve transport-commons types ([#1396](https://github.com/feathersjs/feathers/issues/1396)) ([f9d8536](https://github.com/feathersjs/feathers/commit/f9d8536)) - -# [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 - -- Make oAuth paths more consistent and improve authentication client ([#1377](https://github.com/feathersjs/feathers/issues/1377)) ([adb2543](https://github.com/feathersjs/feathers/commit/adb2543)) -- 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 - -- Add fallback for legacy socket authenticate event ([#1356](https://github.com/feathersjs/feathers/issues/1356)) ([61b1056](https://github.com/feathersjs/feathers/commit/61b1056)) -- Throw NotAuthenticated on token verification errors ([#1357](https://github.com/feathersjs/feathers/issues/1357)) ([e0120df](https://github.com/feathersjs/feathers/commit/e0120df)) - -### Features - -- Add global disconnect event ([#1355](https://github.com/feathersjs/feathers/issues/1355)) ([85afcca](https://github.com/feathersjs/feathers/commit/85afcca)) - -# [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 - -- Add registerPublisher alias for .publish ([#1302](https://github.com/feathersjs/feathers/issues/1302)) ([98fe8f8](https://github.com/feathersjs/feathers/commit/98fe8f8)) - -# [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 - -- Compare socket event data using lodash's isEqual instead of indexOf ([#1061](https://github.com/feathersjs/feathers/issues/1061)) ([f706db3](https://github.com/feathersjs/feathers/commit/f706db3)) -- 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 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)) -- **package:** update debug to version 3.0.0 ([#45](https://github.com/feathersjs/feathers/issues/45)) ([9b9bde5](https://github.com/feathersjs/feathers/commit/9b9bde5)) - -### Features - -- Add TypeScript definitions ([#1275](https://github.com/feathersjs/feathers/issues/1275)) ([9dd6713](https://github.com/feathersjs/feathers/commit/9dd6713)) -- Allow registering a service at the root level ([#1115](https://github.com/feathersjs/feathers/issues/1115)) ([c73d322](https://github.com/feathersjs/feathers/commit/c73d322)) - -## [4.2.1](https://github.com/feathersjs/feathers/compare/@feathersjs/transport-commons@4.2.0...@feathersjs/transport-commons@4.2.1) (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)) - - - -# [4.2.0](https://github.com/feathersjs/feathers/compare/@feathersjs/transport-commons@4.1.6...@feathersjs/transport-commons@4.2.0) (2018-12-16) - -### Features - -- Allow registering a service at the root level ([#1115](https://github.com/feathersjs/feathers/issues/1115)) ([c73d322](https://github.com/feathersjs/feathers/commit/c73d322)) - - - -## [4.1.6](https://github.com/feathersjs/feathers/compare/@feathersjs/transport-commons@4.1.5...@feathersjs/transport-commons@4.1.6) (2018-10-25) - -### Bug Fixes - -- Compare socket event data using lodash's isEqual instead of indexOf ([#1061](https://github.com/feathersjs/feathers/issues/1061)) ([f706db3](https://github.com/feathersjs/feathers/commit/f706db3)) -- Make Mocha a proper devDependency for every repository ([#1053](https://github.com/feathersjs/feathers/issues/1053)) ([9974803](https://github.com/feathersjs/feathers/commit/9974803)) - - - -## [4.1.5](https://github.com/feathersjs/feathers/compare/@feathersjs/transport-commons@4.1.4...@feathersjs/transport-commons@4.1.5) (2018-09-21) - -**Note:** Version bump only for package @feathersjs/transport-commons - - - -## [4.1.4](https://github.com/feathersjs/feathers/compare/@feathersjs/transport-commons@4.1.3...@feathersjs/transport-commons@4.1.4) (2018-09-17) - -**Note:** Version bump only for package @feathersjs/transport-commons - - - -## [4.1.3](https://github.com/feathersjs/feathers/compare/@feathersjs/transport-commons@4.1.2...@feathersjs/transport-commons@4.1.3) (2018-09-02) - -**Note:** Version bump only for package @feathersjs/transport-commons - - - -## 4.1.2 - -- Migrate to Monorepo ([feathers#462](https://github.com/feathersjs/feathers/issues/462)) - -## [v4.1.1](https://github.com/feathersjs/transport-commons/tree/v4.1.1) (2018-07-03) - -[Full Changelog](https://github.com/feathersjs/transport-commons/compare/v4.1.0...v4.1.1) - -**Merged pull requests:** - -- Properly dispatch arrays that do not come from Feathers hook events [\#77](https://github.com/feathersjs/transport-commons/pull/77) ([daffl](https://github.com/daffl)) - -## [v4.1.0](https://github.com/feathersjs/transport-commons/tree/v4.1.0) (2018-06-28) - -[Full Changelog](https://github.com/feathersjs/transport-commons/compare/v4.0.2...v4.1.0) - -**Merged pull requests:** - -- Remove empty channels [\#75](https://github.com/feathersjs/transport-commons/pull/75) ([daffl](https://github.com/daffl)) - -## [v4.0.2](https://github.com/feathersjs/transport-commons/tree/v4.0.2) (2018-06-12) - -[Full Changelog](https://github.com/feathersjs/transport-commons/compare/v4.0.1...v4.0.2) - -**Merged pull requests:** - -- Fix looking up invalid path names through sockets [\#76](https://github.com/feathersjs/transport-commons/pull/76) ([daffl](https://github.com/daffl)) - -## [v4.0.1](https://github.com/feathersjs/transport-commons/tree/v4.0.1) (2018-05-30) - -[Full Changelog](https://github.com/feathersjs/transport-commons/compare/v4.0.0...v4.0.1) - -**Merged pull requests:** - -- Update Codeclimate settings [\#74](https://github.com/feathersjs/transport-commons/pull/74) ([daffl](https://github.com/daffl)) - -## [v4.0.0](https://github.com/feathersjs/transport-commons/tree/v4.0.0) (2018-02-09) - -[Full Changelog](https://github.com/feathersjs/transport-commons/compare/v3.2.0...v4.0.0) - -**Closed issues:** - -- Additional data for client errors [\#72](https://github.com/feathersjs/transport-commons/issues/72) - -**Merged pull requests:** - -- Throw a Timeout error on send timeout instead of Error [\#73](https://github.com/feathersjs/transport-commons/pull/73) ([TimNZ](https://github.com/TimNZ)) -- Pass connection in params [\#71](https://github.com/feathersjs/transport-commons/pull/71) ([daffl](https://github.com/daffl)) -- Move socket handling into its own file [\#70](https://github.com/feathersjs/transport-commons/pull/70) ([daffl](https://github.com/daffl)) - -## [v3.2.0](https://github.com/feathersjs/transport-commons/tree/v3.2.0) (2018-01-30) - -[Full Changelog](https://github.com/feathersjs/transport-commons/compare/v3.1.5...v3.2.0) - -**Closed issues:** - -- Publishing to a channel fails after passing safety check [\#66](https://github.com/feathersjs/transport-commons/issues/66) -- Feathers Server Ends unexpected if some arg to socket.io is a ipv6 local subnet [\#65](https://github.com/feathersjs/transport-commons/issues/65) - -**Merged pull requests:** - -- Rename to @feathersjs/transport-commons [\#69](https://github.com/feathersjs/transport-commons/pull/69) ([daffl](https://github.com/daffl)) -- Switch to Radix tree based routing [\#68](https://github.com/feathersjs/transport-commons/pull/68) ([daffl](https://github.com/daffl)) -- Update mocha to the latest version 🚀 [\#64](https://github.com/feathersjs/transport-commons/pull/64) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update semistandard to the latest version 🚀 [\#63](https://github.com/feathersjs/transport-commons/pull/63) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v3.1.5](https://github.com/feathersjs/transport-commons/tree/v3.1.5) (2017-12-12) - -[Full Changelog](https://github.com/feathersjs/transport-commons/compare/v3.1.4...v3.1.5) - -## [v3.1.4](https://github.com/feathersjs/transport-commons/tree/v3.1.4) (2017-12-12) - -[Full Changelog](https://github.com/feathersjs/transport-commons/compare/v3.1.3...v3.1.4) - -**Merged pull requests:** - -- Fix dispatching of arrays [\#62](https://github.com/feathersjs/transport-commons/pull/62) ([daffl](https://github.com/daffl)) - -## [v3.1.3](https://github.com/feathersjs/transport-commons/tree/v3.1.3) (2017-12-12) - -[Full Changelog](https://github.com/feathersjs/transport-commons/compare/v3.1.2...v3.1.3) - -**Merged pull requests:** - -- Make sure that each entry in an array is dispatched as its own even [\#61](https://github.com/feathersjs/transport-commons/pull/61) ([daffl](https://github.com/daffl)) - -## [v3.1.2](https://github.com/feathersjs/transport-commons/tree/v3.1.2) (2017-12-06) - -[Full Changelog](https://github.com/feathersjs/transport-commons/compare/v3.1.1...v3.1.2) - -**Merged pull requests:** - -- Fix another error when there are no results [\#60](https://github.com/feathersjs/transport-commons/pull/60) ([daffl](https://github.com/daffl)) - -## [v3.1.1](https://github.com/feathersjs/transport-commons/tree/v3.1.1) (2017-12-06) - -[Full Changelog](https://github.com/feathersjs/transport-commons/compare/v3.1.0...v3.1.1) - -**Merged pull requests:** - -- Always use a combined channel [\#59](https://github.com/feathersjs/transport-commons/pull/59) ([daffl](https://github.com/daffl)) - -## [v3.1.0](https://github.com/feathersjs/transport-commons/tree/v3.1.0) (2017-12-06) - -[Full Changelog](https://github.com/feathersjs/transport-commons/compare/v3.0.1...v3.1.0) - -**Merged pull requests:** - -- Give channel dispatchers a precedence [\#58](https://github.com/feathersjs/transport-commons/pull/58) ([daffl](https://github.com/daffl)) - -## [v3.0.1](https://github.com/feathersjs/transport-commons/tree/v3.0.1) (2017-11-03) - -[Full Changelog](https://github.com/feathersjs/transport-commons/compare/v3.0.0...v3.0.1) - -**Closed issues:** - -- Allow socket calls without params and callback [\#54](https://github.com/feathersjs/transport-commons/issues/54) - -**Merged pull requests:** - -- Allow socket calls without query and callback [\#55](https://github.com/feathersjs/transport-commons/pull/55) ([daffl](https://github.com/daffl)) - -## [v3.0.0](https://github.com/feathersjs/transport-commons/tree/v3.0.0) (2017-11-01) - -[Full Changelog](https://github.com/feathersjs/transport-commons/compare/v3.0.0-pre.7...v3.0.0) - -## [v3.0.0-pre.7](https://github.com/feathersjs/transport-commons/tree/v3.0.0-pre.7) (2017-10-25) - -[Full Changelog](https://github.com/feathersjs/transport-commons/compare/v3.0.0-pre.6...v3.0.0-pre.7) - -**Merged pull requests:** - -- Update to better returnHook handling [\#53](https://github.com/feathersjs/transport-commons/pull/53) ([daffl](https://github.com/daffl)) - -## [v3.0.0-pre.6](https://github.com/feathersjs/transport-commons/tree/v3.0.0-pre.6) (2017-10-21) - -[Full Changelog](https://github.com/feathersjs/transport-commons/compare/v3.0.0-pre.5...v3.0.0-pre.6) - -**Closed issues:** - -- feathers-socket-commons produces error when it get bundled and steal-socket.io gets used as connection [\#44](https://github.com/feathersjs/transport-commons/issues/44) -- Surface src/events.js lines 44-69 for feathers-hooks-common/src/filters/combine.js [\#40](https://github.com/feathersjs/transport-commons/issues/40) - -**Merged pull requests:** - -- Updates for Feathers v3 \(Buzzard\) [\#52](https://github.com/feathersjs/transport-commons/pull/52) ([daffl](https://github.com/daffl)) -- Rename repository and use npm scope [\#51](https://github.com/feathersjs/transport-commons/pull/51) ([daffl](https://github.com/daffl)) - -## [v3.0.0-pre.5](https://github.com/feathersjs/transport-commons/tree/v3.0.0-pre.5) (2017-10-18) - -[Full Changelog](https://github.com/feathersjs/transport-commons/compare/v3.0.0-pre.4...v3.0.0-pre.5) - -**Merged pull requests:** - -- Pass events property to the client [\#50](https://github.com/feathersjs/transport-commons/pull/50) ([daffl](https://github.com/daffl)) - -## [v3.0.0-pre.4](https://github.com/feathersjs/transport-commons/tree/v3.0.0-pre.4) (2017-10-17) - -[Full Changelog](https://github.com/feathersjs/transport-commons/compare/v3.0.0-pre.3...v3.0.0-pre.4) - -**Merged pull requests:** - -- Fix the event name and add some channel debug statements [\#49](https://github.com/feathersjs/transport-commons/pull/49) ([daffl](https://github.com/daffl)) - -## [v3.0.0-pre.3](https://github.com/feathersjs/transport-commons/tree/v3.0.0-pre.3) (2017-10-16) - -[Full Changelog](https://github.com/feathersjs/transport-commons/compare/v3.0.0-pre.2...v3.0.0-pre.3) - -**Merged pull requests:** - -- Update mocha to the latest version 🚀 [\#48](https://github.com/feathersjs/transport-commons/pull/48) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v3.0.0-pre.2](https://github.com/feathersjs/transport-commons/tree/v3.0.0-pre.2) (2017-09-28) - -[Full Changelog](https://github.com/feathersjs/transport-commons/compare/v3.0.0-pre.1...v3.0.0-pre.2) - -**Merged pull requests:** - -- Add feathers-channels [\#47](https://github.com/feathersjs/transport-commons/pull/47) ([daffl](https://github.com/daffl)) - -## [v3.0.0-pre.1](https://github.com/feathersjs/transport-commons/tree/v3.0.0-pre.1) (2017-09-08) - -[Full Changelog](https://github.com/feathersjs/transport-commons/compare/v2.4.0...v3.0.0-pre.1) - -**Fixed bugs:** - -- Socket events don't fire for sub-apps nested more than 2 deep [\#5](https://github.com/feathersjs/transport-commons/issues/5) - -**Closed issues:** - -- more tests [\#38](https://github.com/feathersjs/transport-commons/issues/38) - -**Merged pull requests:** - -- Prepare v3.0-pre [\#46](https://github.com/feathersjs/transport-commons/pull/46) ([daffl](https://github.com/daffl)) -- Update debug to the latest version 🚀 [\#45](https://github.com/feathersjs/transport-commons/pull/45) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update feathers-socketio to the latest version 🚀 [\#43](https://github.com/feathersjs/transport-commons/pull/43) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update semistandard to the latest version 🚀 [\#42](https://github.com/feathersjs/transport-commons/pull/42) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) -- Update dependencies to enable Greenkeeper 🌴 [\#41](https://github.com/feathersjs/transport-commons/pull/41) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) - -## [v2.4.0](https://github.com/feathersjs/transport-commons/tree/v2.4.0) (2017-01-07) - -[Full Changelog](https://github.com/feathersjs/transport-commons/compare/v2.3.1...v2.4.0) - -**Implemented enhancements:** - -- support service.json [\#34](https://github.com/feathersjs/transport-commons/issues/34) -- Socket event filters should not force returning data [\#4](https://github.com/feathersjs/transport-commons/issues/4) -- bootstrap service.filters [\#37](https://github.com/feathersjs/transport-commons/pull/37) ([slajax](https://github.com/slajax)) - -**Closed issues:** - -- Sockets timed out request - retry on reconnection \[feat?\] [\#32](https://github.com/feathersjs/transport-commons/issues/32) - -**Merged pull requests:** - -- Normalize arguments when client sends packed data. [\#39](https://github.com/feathersjs/transport-commons/pull/39) ([devel-pa](https://github.com/devel-pa)) -- Create .codeclimate.yml [\#33](https://github.com/feathersjs/transport-commons/pull/33) ([larkinscott](https://github.com/larkinscott)) -- Update feathers-commons to version 0.8.0 🚀 [\#31](https://github.com/feathersjs/transport-commons/pull/31) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- jshint —\> semistandard [\#30](https://github.com/feathersjs/transport-commons/pull/30) ([corymsmith](https://github.com/corymsmith)) -- Code coverage [\#29](https://github.com/feathersjs/transport-commons/pull/29) ([ekryski](https://github.com/ekryski)) - -## [v2.3.1](https://github.com/feathersjs/transport-commons/tree/v2.3.1) (2016-09-02) - -[Full Changelog](https://github.com/feathersjs/transport-commons/compare/v2.3.0...v2.3.1) - -**Merged pull requests:** - -- Make service off method be namespaced [\#26](https://github.com/feathersjs/transport-commons/pull/26) ([t2t2](https://github.com/t2t2)) -- Update mocha to version 3.0.0 🚀 [\#25](https://github.com/feathersjs/transport-commons/pull/25) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) - -## [v2.3.0](https://github.com/feathersjs/transport-commons/tree/v2.3.0) (2016-07-24) - -[Full Changelog](https://github.com/feathersjs/transport-commons/compare/v2.2.1...v2.3.0) - -**Fixed bugs:** - -- Error in filter chain for 'created' event after app.authenticate\(\) [\#12](https://github.com/feathersjs/transport-commons/issues/12) - -**Merged pull requests:** - -- Skip subsequent filters instead of rejecting the promise [\#24](https://github.com/feathersjs/transport-commons/pull/24) ([daffl](https://github.com/daffl)) - -## [v2.2.1](https://github.com/feathersjs/transport-commons/tree/v2.2.1) (2016-07-05) - -[Full Changelog](https://github.com/feathersjs/transport-commons/compare/v2.2.0...v2.2.1) - -## [v2.2.0](https://github.com/feathersjs/transport-commons/tree/v2.2.0) (2016-07-05) - -[Full Changelog](https://github.com/feathersjs/transport-commons/compare/v2.1.0...v2.2.0) - -**Implemented enhancements:** - -- Support native websockets directly [\#8](https://github.com/feathersjs/transport-commons/issues/8) - -**Fixed bugs:** - -- Calling `off` on primus fails [\#7](https://github.com/feathersjs/transport-commons/issues/7) - -**Closed issues:** - -- Should add other eventEmitter methods [\#22](https://github.com/feathersjs/transport-commons/issues/22) -- Patch event sends the whole data back [\#21](https://github.com/feathersjs/transport-commons/issues/21) - -**Merged pull requests:** - -- Pass all EventEmitter methods to the client connection [\#23](https://github.com/feathersjs/transport-commons/pull/23) ([daffl](https://github.com/daffl)) - -## [v2.1.0](https://github.com/feathersjs/transport-commons/tree/v2.1.0) (2016-05-29) - -[Full Changelog](https://github.com/feathersjs/transport-commons/compare/v2.0.0...v2.1.0) - -**Closed issues:** - -- Client should convert error objects to feathers-errors [\#19](https://github.com/feathersjs/transport-commons/issues/19) - -**Merged pull requests:** - -- Make client convert to feathers-errors [\#20](https://github.com/feathersjs/transport-commons/pull/20) ([daffl](https://github.com/daffl)) - -## [v2.0.0](https://github.com/feathersjs/transport-commons/tree/v2.0.0) (2016-05-23) - -[Full Changelog](https://github.com/feathersjs/transport-commons/compare/v1.0.0...v2.0.0) - -**Merged pull requests:** - -- Better handling of sub-apps and sockets [\#18](https://github.com/feathersjs/transport-commons/pull/18) ([daffl](https://github.com/daffl)) -- Update babel-plugin-add-module-exports to version 0.2.0 🚀 [\#17](https://github.com/feathersjs/transport-commons/pull/17) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) -- babel-polyfill@6.7.4 breaks build 🚨 [\#16](https://github.com/feathersjs/transport-commons/pull/16) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot)) - -## [v1.0.0](https://github.com/feathersjs/transport-commons/tree/v1.0.0) (2016-04-28) - -[Full Changelog](https://github.com/feathersjs/transport-commons/compare/v0.2.3...v1.0.0) - -**Implemented enhancements:** - -- Support acknowledgement timeouts [\#9](https://github.com/feathersjs/transport-commons/issues/9) - -**Closed issues:** - -- Feathers over sockets is totally silent when a hook has errors [\#13](https://github.com/feathersjs/transport-commons/issues/13) -- Listener warning when you register your own events on the socket [\#10](https://github.com/feathersjs/transport-commons/issues/10) - -**Merged pull requests:** - -- Support timeouts for socket clients [\#15](https://github.com/feathersjs/transport-commons/pull/15) ([daffl](https://github.com/daffl)) -- Convert errors in socket callbacks [\#14](https://github.com/feathersjs/transport-commons/pull/14) ([daffl](https://github.com/daffl)) - -## [v0.2.3](https://github.com/feathersjs/transport-commons/tree/v0.2.3) (2016-04-16) - -[Full Changelog](https://github.com/feathersjs/transport-commons/compare/v0.2.2...v0.2.3) - -**Merged pull requests:** - -- Remove connection setMaxListeners [\#11](https://github.com/feathersjs/transport-commons/pull/11) ([daffl](https://github.com/daffl)) - -## [v0.2.2](https://github.com/feathersjs/transport-commons/tree/v0.2.2) (2016-03-22) - -[Full Changelog](https://github.com/feathersjs/transport-commons/compare/v0.2.1...v0.2.2) - -**Merged pull requests:** - -- Allow chaining event listeners. [\#6](https://github.com/feathersjs/transport-commons/pull/6) ([joshuajabbour](https://github.com/joshuajabbour)) - -## [v0.2.1](https://github.com/feathersjs/transport-commons/tree/v0.2.1) (2016-03-08) - -[Full Changelog](https://github.com/feathersjs/transport-commons/compare/v0.2.0...v0.2.1) - -**Merged pull requests:** - -- Set connection max listeners and better debug messages [\#3](https://github.com/feathersjs/transport-commons/pull/3) ([daffl](https://github.com/daffl)) - -## [v0.2.0](https://github.com/feathersjs/transport-commons/tree/v0.2.0) (2016-02-08) - -[Full Changelog](https://github.com/feathersjs/transport-commons/compare/v0.1.0...v0.2.0) - -**Merged pull requests:** - -- Query params [\#2](https://github.com/feathersjs/transport-commons/pull/2) ([ekryski](https://github.com/ekryski)) -- Adding nsp check [\#1](https://github.com/feathersjs/transport-commons/pull/1) ([marshallswain](https://github.com/marshallswain)) - -## [v0.1.0](https://github.com/feathersjs/transport-commons/tree/v0.1.0) (2016-01-21) - -\* _This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)_ diff --git a/packages/transport-commons/LICENSE b/packages/transport-commons/LICENSE deleted file mode 100644 index 7712f870f3..0000000000 --- a/packages/transport-commons/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2024 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 -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -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 deleted file mode 100644 index bce17ee0b5..0000000000 --- a/packages/transport-commons/README.md +++ /dev/null @@ -1,13 +0,0 @@ -# @feathersjs/transport-commons - -[![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/transport-commons.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/transport-commons) -[![Discord](https://badgen.net/badge/icon/discord?icon=discord&label)](https://discord.gg/qa8kez8QBx) - -> Shared functionality for Feathers API transports like `@feathers/socketio` and `@feathersjs/primus`. Only intended to be used internally. - -## License - -Copyright (c) 2024 [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 deleted file mode 100644 index ee328040cf..0000000000 --- a/packages/transport-commons/client.d.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './lib/client' diff --git a/packages/transport-commons/client.js b/packages/transport-commons/client.js deleted file mode 100644 index 19d52462d8..0000000000 --- a/packages/transport-commons/client.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('./lib/client'); \ No newline at end of file diff --git a/packages/transport-commons/package.json b/packages/transport-commons/package.json deleted file mode 100644 index de7805c562..0000000000 --- a/packages/transport-commons/package.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "name": "@feathersjs/transport-commons", - "description": "Shared functionality for websocket providers", - "version": "5.0.34", - "homepage": "https://feathersjs.com", - "main": "lib/", - "types": "lib/", - "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", - "directory": "packages/transport-commons" - }, - "author": { - "name": "Feathers contributors", - "email": "hello@feathersjs.com", - "url": "https://feathersjs.com" - }, - "contributors": [], - "bugs": { - "url": "https://github.com/feathersjs/feathers/issues" - }, - "engines": { - "node": ">= 12" - }, - "scripts": { - "prepublish": "npm run compile", - "pack": "npm pack --pack-destination ../generators/test/build", - "compile": "shx rm -rf lib/ && tsc && npm run pack", - "test": "npm run mocha", - "mocha": "mocha --config ../../.mocharc.json --recursive test/**.test.ts test/**/*.test.ts" - }, - "directories": { - "lib": "lib" - }, - "publishConfig": { - "access": "public" - }, - "files": [ - "CHANGELOG.md", - "LICENSE", - "README.md", - "src/**", - "lib/**", - "*.d.ts", - "*.js" - ], - "dependencies": { - "@feathersjs/commons": "^5.0.34", - "@feathersjs/errors": "^5.0.34", - "@feathersjs/feathers": "^5.0.34", - "encodeurl": "^2.0.0", - "lodash": "^4.17.21" - }, - "devDependencies": { - "@types/encodeurl": "^1.0.3", - "@types/lodash": "^4.17.20", - "@types/mocha": "^10.0.10", - "@types/node": "^24.1.0", - "mocha": "^11.7.1", - "shx": "^0.4.0", - "ts-node": "^10.9.2", - "typescript": "^5.9.2" - }, - "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" -} diff --git a/packages/transport-commons/src/channels/index.ts b/packages/transport-commons/src/channels/index.ts deleted file mode 100644 index 2c7a5fc707..0000000000 --- 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 16188c99f2..0000000000 --- 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 deleted file mode 100644 index ad075f3044..0000000000 --- a/packages/transport-commons/src/client.ts +++ /dev/null @@ -1,187 +0,0 @@ -/* 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' - -const debug = createDebug('@feathersjs/transport-commons/client') - -const namespacedEmitterMethods = [ - 'addListener', - 'addEventListener', - 'emit', - 'listenerCount', - 'listeners', - 'on', - 'once', - 'prependListener', - 'prependOnceListener', - 'removeAllListeners', - 'removeEventListener', - 'removeListener' -] -const otherEmitterMethods = ['eventNames', 'getMaxListeners', 'setMaxListeners'] - -const addEmitterMethods = (service: any) => { - otherEmitterMethods.forEach((method) => { - service[method] = function (...args: any[]) { - if (typeof this.connection[method] !== 'function') { - throw new Error(`Can not call '${method}' on the client service connection`) - } - - return this.connection[method](...args) - } - }) - - // Methods that should add the namespace (service path) - namespacedEmitterMethods.forEach((method) => { - service[method] = function (name: string, ...args: any[]) { - if (typeof this.connection[method] !== 'function') { - throw new Error(`Can not call '${method}' on the client service connection`) - } - - const eventName = `${this.path} ${name}` - - debug(`Calling emitter method ${method} with ` + `namespaced event '${eventName}'`) - - const result = this.connection[method](eventName, ...args) - - return result === this.connection ? this : result - } - }) -} - -interface ServiceOptions { - name: string - connection: any - method: string - events?: string[] -} - -export type SocketService, P extends Params = Params> = Service - -export class Service, P extends Params = Params> - implements ServiceInterface -{ - events: string[] - path: string - connection: any - method: string - - constructor(options: ServiceOptions) { - this.events = options.events - this.path = options.name - this.connection = options.connection - this.method = options.method - - addEmitterMethods(this) - } - - send(method: string, ...args: any[]) { - return new Promise((resolve, reject) => { - const route: Record = args.pop() - let path = this.path - if (route) { - Object.keys(route).forEach((key) => { - path = path.replace(`:${key}`, route[key]) - }) - } - args.unshift(method, path) - - const socketTimeout = this.connection.flags?.timeout || this.connection._opts?.ackTimeout - if (socketTimeout !== undefined) { - args.push(function (timeoutError: any, error: any, data: any) { - return timeoutError || error ? reject(convert(timeoutError || error)) : resolve(data) - }) - } else { - args.push(function (error: any, data: any) { - return error ? reject(convert(error)) : resolve(data) - }) - } - - debug(`Sending socket.${this.method}`, args) - - this.connection[this.method](...args) - }) - } - - methods(this: any, ...names: string[]) { - names.forEach((method) => { - const _method = `_${method}` - this[_method] = function (data: any, params: Params = {}) { - return this.send(method, data, params.query || {}, params.route || {}) - } - this[method] = function (data: any, params: Params = {}) { - return this[_method](data, params, params.route || {}) - } - }) - return this - } - - _find(params: Params = {}) { - return this.send('find', params.query || {}, params.route || {}) - } - - find(params: Params = {}) { - return this._find(params) - } - - _get(id: Id, params: Params = {}) { - return this.send('get', id, params.query || {}, params.route || {}) - } - - get(id: Id, params: Params = {}) { - return this._get(id, params) - } - - _create(data: D, params: Params = {}) { - return this.send('create', data, params.query || {}, params.route || {}) - } - - create(data: D, params: Params = {}) { - return this._create(data, params) - } - - _update(id: NullableId, data: D, params: Params = {}) { - if (typeof id === 'undefined') { - return Promise.reject(new Error("id for 'update' can not be undefined")) - } - return this.send('update', id, data, params.query || {}, params.route || {}) - } - - update(id: NullableId, data: D, params: Params = {}) { - return this._update(id, data, params) - } - - _patch(id: NullableId, data: D, params: Params = {}) { - return this.send('patch', id, data, params.query || {}, params.route || {}) - } - - patch(id: NullableId, data: D, params: Params = {}) { - return this._patch(id, data, params) - } - - _remove(id: NullableId, params: Params = {}) { - return this.send('remove', id, params.query || {}, params.route || {}) - } - - remove(id: NullableId, params: Params = {}) { - return this._remove(id, params) - } - - // `off` is actually not part of the Node event emitter spec - // but we are adding it since everybody is expecting it because - // of the emitter-component Socket.io is using - off(name: string, ...args: any[]) { - if (typeof this.connection.off === 'function') { - const result = this.connection.off(`${this.path} ${name}`, ...args) - - return result === this.connection ? this : result - } else if (args.length === 0) { - // @ts-ignore - return this.removeAllListeners(name) - } - - // @ts-ignore - return this.removeListener(name, ...args) - } -} diff --git a/packages/transport-commons/src/index.ts b/packages/transport-commons/src/index.ts deleted file mode 100644 index bc3d1c18c8..0000000000 --- a/packages/transport-commons/src/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -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 } diff --git a/packages/transport-commons/src/routing/index.ts b/packages/transport-commons/src/routing/index.ts deleted file mode 100644 index 8e4870347f..0000000000 --- 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/socket/index.ts b/packages/transport-commons/src/socket/index.ts deleted file mode 100644 index 1c21095fd1..0000000000 --- a/packages/transport-commons/src/socket/index.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { Application, getServiceOptions, Params, RealTimeConnection } from '@feathersjs/feathers' -import { channels } from '../channels' -import { routing } from '../routing' -import { getDispatcher, runMethod } from './utils' - -export interface SocketOptions { - done: Promise - emit: string - socketMap: WeakMap - socketKey?: any - getParams: (socket: any) => RealTimeConnection -} - -export function socket({ done, emit, socketMap, socketKey, getParams }: SocketOptions) { - return (app: Application) => { - const leaveChannels = (connection: RealTimeConnection) => { - const { channels } = app - - if (channels.length) { - app.channel(app.channels).leave(connection) - } - } - - app.configure(channels()) - app.configure(routing()) - - app.on('publish', getDispatcher(emit, socketMap, socketKey)) - app.on('disconnect', leaveChannels) - app.on('logout', (_authResult: any, params: Params) => { - const { connection } = params - - if (connection) { - leaveChannels(connection) - } - }) - - // `connection` event - done.then((provider) => - provider.on('connection', (connection: any) => app.emit('connection', getParams(connection))) - ) - - // `socket.emit('methodName', 'serviceName', ...args)` handlers - done.then((provider) => - provider.on('connection', (connection: any) => { - const methodHandlers = Object.keys(app.services).reduce((result, name) => { - const { methods } = getServiceOptions(app.service(name)) - - methods.forEach((method) => { - if (!result[method]) { - result[method] = (...args: any[]) => { - const [path, ...rest] = args - - runMethod(app, getParams(connection), path, method, rest) - } - } - }) - - return result - }, {} as any) - - Object.keys(methodHandlers).forEach((key) => connection.on(key, methodHandlers[key])) - }) - ) - } -} diff --git a/packages/transport-commons/src/socket/utils.ts b/packages/transport-commons/src/socket/utils.ts deleted file mode 100644 index 768bba469a..0000000000 --- a/packages/transport-commons/src/socket/utils.ts +++ /dev/null @@ -1,128 +0,0 @@ -import { - HookContext, - Application, - RealTimeConnection, - createContext, - getServiceOptions -} 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' - -const debug = createDebug('@feathersjs/transport-commons') - -export const DEFAULT_PARAMS_POSITION = 1 - -export const paramsPositions: { [key: string]: number } = { - find: 0, - update: 2, - patch: 2 -} - -export function normalizeError(e: any) { - const hasToJSON = typeof e.toJSON === 'function' - const result = hasToJSON ? e.toJSON() : {} - - if (!hasToJSON) { - Object.getOwnPropertyNames(e).forEach((key) => { - result[key] = e[key] - }) - } - - if (process.env.NODE_ENV === 'production') { - delete result.stack - } - - delete result.hook - - return result -} - -export function getDispatcher(emit: string, socketMap: WeakMap, socketKey?: any) { - return function (event: string, channel: CombinedChannel, context: HookContext, data?: any) { - debug(`Dispatching '${event}' to ${channel.length} connections`) - - channel.connections.forEach((connection) => { - // The reference between connection and socket is set in `app.setup` - const socket = socketKey ? connection[socketKey] : socketMap.get(connection) - - if (socket) { - const eventName = `${context.path || ''} ${event}`.trim() - - let result = channel.dataFor(connection) || context.dispatch || context.result - - // If we are getting events from an array but try to dispatch individual data - // try to get the individual item to dispatch from the correct index. - if (!Array.isArray(data) && Array.isArray(context.result) && Array.isArray(result)) { - result = result.find((resultData) => isEqual(resultData, data)) - } - - debug(`Dispatching '${eventName}' to Socket ${socket.id} with`, result) - - socket[emit](eventName, result) - } - }) - } -} - -export async function runMethod( - app: Application, - connection: RealTimeConnection, - _path: string, - _method: string, - args: any[] -) { - const path = typeof _path === 'string' ? _path : null - const method = typeof _method === 'string' ? _method : null - const trace = `method '${method}' on service '${path}'` - const methodArgs = args.slice(0) - const callback = - // eslint-disable-next-line @typescript-eslint/no-empty-function - typeof methodArgs[methodArgs.length - 1] === 'function' ? methodArgs.pop() : function () {} - - debug(`Running ${trace}`, connection, args) - - const handleError = (error: any) => { - debug(`Error in ${trace}`, error) - callback(normalizeError(error)) - } - - try { - const lookup = app.lookup(path) - - // No valid service was found throw a NotFound error - if (lookup === null) { - throw new NotFound(path === null ? `Invalid service path` : `Service '${path}' not found`) - } - - const { service, params: route = {} } = lookup - const { methods } = getServiceOptions(service) - - // Only service methods are allowed - if (!methods.includes(method)) { - throw new MethodNotAllowed(`Method '${method}' not allowed on service '${path}'`) - } - - const position = paramsPositions[method] !== undefined ? paramsPositions[method] : DEFAULT_PARAMS_POSITION - const query = Object.assign({}, methodArgs[position]) - // `params` have to be re-mapped to the query and added with the route - const params = Object.assign({ query, route, connection }, connection) - - // `params` is always the last parameter. Error if we got more arguments. - if (methodArgs.length > position + 1) { - throw new BadRequest(`Too many arguments for '${method}' method`) - } - - methodArgs[position] = params - - const ctx = createContext(service, method) - const returnedCtx: HookContext = await (service as any)[method](...methodArgs, ctx) - const result = returnedCtx.dispatch || returnedCtx.result - - debug(`Returned successfully ${trace}`, result) - callback(null, result) - } catch (error: any) { - handleError(error) - } -} diff --git a/packages/transport-commons/test/channels/dispatch.test.ts b/packages/transport-commons/test/channels/dispatch.test.ts deleted file mode 100644 index 8165e3b439..0000000000 --- a/packages/transport-commons/test/channels/dispatch.test.ts +++ /dev/null @@ -1,239 +0,0 @@ -/* 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' - -class TestService { - events = ['foo'] - - async create(payload: any) { - return payload - } -} - -describe('app.publish', () => { - let app: Application - - beforeEach(() => { - app = feathers().configure(channels()) - }) - - it('throws an error if service does not send the event', () => { - try { - app.use('/test', { - create(data: any) { - return Promise.resolve(data) - } - }) - - app.service('test').registerPublisher('created', function () {}) - app.service('test').registerPublisher('bla', function () {}) - assert.ok(false, 'Should never get here') - } catch (e: any) { - assert.strictEqual(e.message, "'bla' is not a valid service event") - } - }) - - describe('registration and `dispatch` event', () => { - const c1 = { id: 1, test: true } - const c2 = { id: 2, test: true } - const data = { message: 'This is a test' } - - beforeEach(() => { - app.use('/test', new TestService()) - }) - - it('error in publisher is handled gracefully (#1707)', async () => { - app.service('test').publish('created', () => { - throw new Error('Something went wrong') - }) - - try { - await app.service('test').create({ message: 'something' }) - } catch (error: any) { - assert.fail('Should never get here') - } - }) - - it('simple event registration and dispatching', (done) => { - app.channel('testing').join(c1) - - app.service('test').registerPublisher('created', () => app.channel('testing')) - - app.once('publish', (event: string, channel: Channel, hook: HookContext) => { - try { - assert.strictEqual(event, 'created') - assert.strictEqual(hook.path, 'test') - assert.deepStrictEqual(hook.result, data) - assert.deepStrictEqual(channel.connections, [c1]) - done() - } catch (error: any) { - done(error) - } - }) - - app.service('test').create(data).catch(done) - }) - - it('app and global level dispatching and precedence', (done) => { - app.channel('testing').join(c1) - app.channel('other').join(c2) - - app.registerPublisher('created', () => app.channel('testing')) - app.registerPublisher(() => app.channel('other')) - - app.once('publish', (_event: string, channel: Channel) => { - assert.ok(channel.connections.indexOf(c1) !== -1) - done() - }) - - app.service('test').create(data).catch(done) - }) - - it('promise event dispatching', (done) => { - app.channel('testing').join(c1) - app.channel('othertest').join(c2) - - app - .service('test') - .registerPublisher( - 'created', - () => new Promise((resolve) => setTimeout(() => resolve(app.channel('testing')), 50)) - ) - app - .service('test') - .registerPublisher( - 'created', - () => new Promise((resolve) => setTimeout(() => resolve(app.channel('testing', 'othertest')), 100)) - ) - - app.once('publish', (_event: string, channel: Channel, hook: HookContext) => { - assert.deepStrictEqual(hook.result, data) - assert.deepStrictEqual(channel.connections, [c1, c2]) - done() - }) - - app.service('test').create(data).catch(done) - }) - - it('custom event dispatching', (done) => { - const eventData = { testing: true } - - app.channel('testing').join(c1) - app.channel('othertest').join(c2) - - app.service('test').registerPublisher('foo', () => app.channel('testing')) - - app.once('publish', (event: string, channel: Channel, hook: HookContext) => { - assert.strictEqual(event, 'foo') - assert.deepStrictEqual(hook, { - app, - path: 'test', - service: app.service('test'), - result: eventData - }) - assert.deepStrictEqual(channel.connections, [c1]) - done() - }) - - app.service('test').emit('foo', eventData) - }) - - it('does not sent `dispatch` event if there are no dispatchers', (done) => { - app.once('publish', () => done(new Error('Should never get here'))) - - process.once('unhandledRejection', (error) => done(error)) - - app - .service('test') - .create(data) - .then(() => done()) - .catch(done) - }) - - it('does not send `dispatch` event if there are no connections', (done) => { - app.service('test').registerPublisher('created', () => app.channel('dummy')) - app.once('publish', () => done(new Error('Should never get here'))) - - app - .service('test') - .create(data) - .then(() => done()) - .catch(done) - }) - - it('dispatcher returning an array of channels', (done) => { - app.channel('testing').join(c1) - app.channel('othertest').join(c2) - - app - .service('test') - .registerPublisher('created', () => [app.channel('testing'), app.channel('othertest')]) - - app.once('publish', (_event: string, channel: Channel, hook: HookContext) => { - assert.deepStrictEqual(hook.result, data) - assert.deepStrictEqual(channel.connections, [c1, c2]) - done() - }) - - app.service('test').create(data).catch(done) - }) - - it('dispatcher can send data', (done) => { - const c1data = { channel: 'testing' } - - app.channel('testing').join(c1) - app.channel('othertest').join(c2) - - app - .service('test') - .registerPublisher('created', () => [app.channel('testing').send(c1data), app.channel('othertest')]) - - app.once('publish', (_event: string, channel: CombinedChannel, hook: HookContext) => { - assert.deepStrictEqual(hook.result, data) - assert.deepStrictEqual(channel.dataFor(c1), c1data) - assert.ok(channel.dataFor(c2) === null) - assert.deepStrictEqual(channel.connections, [c1, c2]) - done() - }) - - app.service('test').create(data).catch(done) - }) - - it('publisher precedence and preventing publishing', (done) => { - app.channel('test').join(c1) - - app.registerPublisher(() => app.channel('test')) - app.service('test').registerPublisher('created', (): null => null) - - app.once('publish', () => done(new Error('Should never get here'))) - - app - .service('test') - .create(data) - .then(() => done()) - .catch(done) - }) - - it('data of first channel has precedence', (done) => { - const sendData = { test: true } - - app.channel('testing').join(c1) - app.channel('othertest').join(c1) - - app.service('test').registerPublisher('created', () => { - return [app.channel('testing'), app.channel('othertest').send(sendData)] - }) - - app.once('publish', (_event: string, channel: CombinedChannel) => { - assert.strictEqual(channel.dataFor(c1), null) - assert.deepStrictEqual(channel.connections, [c1]) - done() - }) - - app.service('test').create(data).catch(done) - }) - }) -}) diff --git a/packages/transport-commons/test/channels/index.test.ts b/packages/transport-commons/test/channels/index.test.ts deleted file mode 100644 index 1aedf10643..0000000000 --- a/packages/transport-commons/test/channels/index.test.ts +++ /dev/null @@ -1,44 +0,0 @@ -/* eslint-disable @typescript-eslint/no-empty-function */ -import assert from 'assert' -import { feathers } from '@feathersjs/feathers' -import { channels, keys } from '../../src/channels' - -describe('feathers-channels', () => { - it('has app.channel', () => { - const app = feathers().configure(channels()) - - assert.strictEqual(typeof app.channel, 'function') - assert.strictEqual(typeof (app as any)[keys.CHANNELS], 'object') - assert.strictEqual(app.channels.length, 0) - }) - - it('throws an error when called with nothing', () => { - const app = feathers().configure(channels()) - - try { - app.channel() - assert.ok(false, 'Should never get here') - } catch (e: any) { - assert.strictEqual(e.message, 'app.channel needs at least one channel name') - } - }) - - 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 service: any = app.service('test') - - assert.ok(!service[keys.PUBLISHERS]) - }) -}) diff --git a/packages/transport-commons/test/client.test.ts b/packages/transport-commons/test/client.test.ts deleted file mode 100644 index ea307db776..0000000000 --- a/packages/transport-commons/test/client.test.ts +++ /dev/null @@ -1,347 +0,0 @@ -/* 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 { NotAuthenticated } from '@feathersjs/errors' -import { Service, SocketService } from '../src/client' - -declare type DummyCallback = (err: any, data?: any) => void - -describe('client', () => { - let connection: any - let testData: any - let service: SocketService & CustomMethods<{ customMethod: any }> & EventEmitter - - beforeEach(() => { - connection = new EventEmitter() - testData = { data: 'testing ' } - service = new Service({ - events: ['created'], - name: 'todos', - method: 'emit', - connection - }) as any - }) - - it('sets `events` property on service', () => { - assert.ok(service.events) - }) - - it('throws an error when the emitter does not have the method', () => { - const clientService = new Service({ - name: 'todos', - method: 'emit', - connection: {} - }) as Service & EventEmitter - - try { - clientService.eventNames() - assert.ok(false, 'Should never get here') - } catch (e: any) { - assert.strictEqual(e.message, "Can not call 'eventNames' on the client service connection") - } - - try { - clientService.on('test', () => {}) - assert.ok(false, 'Should never get here') - } catch (e: any) { - assert.strictEqual(e.message, "Can not call 'on' on the client service connection") - } - }) - - it('allows chaining event listeners', () => { - assert.strictEqual( - service, - service.on('thing', () => {}) - ) - assert.strictEqual( - service, - service.once('other thing', () => {}) - ) - }) - - it('initializes and emits namespaced events', (done) => { - connection.once('todos test', (data: any) => { - assert.deepStrictEqual(data, testData) - done() - }) - service.emit('test', testData) - }) - - it('has other emitter methods', () => { - assert.ok(service.eventNames()) - }) - - it('can receive pathed events', (done) => { - service.once('thing', (data) => { - assert.deepStrictEqual(data, testData) - done() - }) - - connection.emit('todos thing', testData) - }) - - it('sends all service and custom methods with acknowledgement', async () => { - const idCb = (_path: any, id: any, _params: any, callback: DummyCallback) => callback(null, { id }) - const idDataCb = (_path: any, _id: any, data: any, _params: any, callback: DummyCallback) => - callback(null, data) - const dataCb = (_path: any, data: any, _params: any, callback: DummyCallback) => { - data.created = true - callback(null, data) - } - - connection.once('create', dataCb) - service.methods('customMethod') - - let res = await service.create(testData) - - assert.ok(res.created) - - connection.once('get', idCb) - res = await service.get(1) - assert.deepStrictEqual(res, { id: 1 }) - - connection.once('remove', idCb) - res = await service.remove(12) - assert.deepStrictEqual(res, { id: 12 }) - - connection.once('update', idDataCb) - res = await service.update(12, testData) - assert.deepStrictEqual(res, testData) - - connection.once('patch', idDataCb) - res = await service.patch(12, testData) - assert.deepStrictEqual(res, testData) - - connection.once('customMethod', dataCb) - res = await service.customMethod({ message: 'test' }) - assert.deepStrictEqual(res, { - created: true, - message: 'test' - }) - - connection.once('find', (_path: any, params: any, callback: DummyCallback) => callback(null, { params })) - - res = await service.find({ query: { test: true } }) - assert.deepStrictEqual(res, { - params: { test: true } - }) - }) - - it('replace placeholder in service paths', async () => { - service = new Service({ - events: ['created'], - name: ':slug/todos', - method: 'emit', - connection - }) as any - - const idCb = (path: any, _id: any, _params: any, callback: DummyCallback) => callback(null, path) - const idDataCb = (path: any, _id: any, _data: any, _params: any, callback: DummyCallback) => - callback(null, path) - const dataCb = (path: any, _data: any, _params: any, callback: DummyCallback) => { - callback(null, path) - } - - connection.once('create', dataCb) - service.methods('customMethod') - - let res = await service.create(testData, { - route: { - slug: 'mySlug' - } - }) - - assert.strictEqual(res, 'mySlug/todos') - - connection.once('get', idCb) - res = await service.get(1, { - route: { - slug: 'mySlug' - } - }) - assert.strictEqual(res, 'mySlug/todos') - - connection.once('remove', idCb) - res = await service.remove(12, { - route: { - slug: 'mySlug' - } - }) - assert.strictEqual(res, 'mySlug/todos') - - connection.once('update', idDataCb) - res = await service.update(12, testData, { - route: { - slug: 'mySlug' - } - }) - assert.strictEqual(res, 'mySlug/todos') - - connection.once('patch', idDataCb) - res = await service.patch(12, testData, { - route: { - slug: 'mySlug' - } - }) - assert.strictEqual(res, 'mySlug/todos') - - connection.once('customMethod', dataCb) - res = await service.customMethod( - { message: 'test' }, - { - route: { - slug: 'mySlug' - } - } - ) - assert.strictEqual(res, 'mySlug/todos') - - connection.once('find', (path: any, _params: any, callback: DummyCallback) => callback(null, path)) - - res = await service.find({ - query: { test: true }, - route: { - slug: 'mySlug' - } - }) - assert.strictEqual(res, 'mySlug/todos') - }) - - it('converts to feathers-errors (#19)', async () => { - connection.once('create', (_path: any, _data: any, _params: any, callback: DummyCallback) => - callback(new NotAuthenticated('Test', { hi: 'me' }).toJSON()) - ) - - await assert.rejects(() => service.create(testData), { - name: 'NotAuthenticated', - message: 'Test', - code: 401, - data: { hi: 'me' } - }) - }) - - it('converts other errors (#19)', async () => { - connection.once('create', (_path: string, _data: any, _params: any, callback: (x: string) => void) => { - callback('Something went wrong') // eslint-disable-line - }) - - await assert.rejects(() => service.create(testData), { - message: 'Something went wrong' - }) - }) - - it('has all EventEmitter methods', (done) => { - const testing = { hello: 'world' } - const callback = (data: any) => { - assert.deepStrictEqual(data, testing) - assert.strictEqual(service.listenerCount('test'), 1) - service.removeListener('test', callback) - assert.strictEqual(service.listenerCount('test'), 0) - done() - } - - service.addListener('test', callback) - - connection.emit('todos test', testing) - }) - - it('properly handles on/off methods', (done) => { - const testing = { hello: 'world' } - - const callback1 = (data: any) => { - assert.deepStrictEqual(data, testing) - assert.strictEqual(service.listenerCount('test'), 3) - service.off('test', callback1) - assert.strictEqual(service.listenerCount('test'), 2) - service.removeAllListeners('test') - assert.strictEqual(service.listenerCount('test'), 0) - done() - } - const callback2 = () => { - // noop - } - - service.on('test', callback1) - service.on('test', callback2) - service.on('test', callback2) - - connection.emit('todos test', testing) - }) - - it('forwards namespaced call to .off, returns service instance', () => { - // Use it's own connection and service so off method gets detected - const conn = new EventEmitter() - - // @ts-ignore - conn.off = function (name) { - assert.strictEqual(name, 'todos test') - - return this - } - - const client = new Service({ - name: 'todos', - method: 'emit', - connection: conn - }) - - assert.strictEqual(client.off('test'), client) - }) - - it("handles socket.io's weird behavior with ackTimeout", async () => { - connection.flags = { timeout: 10000 } - - const dataCb = ( - _path: any, - data: any, - _params: any, - callback: (timeoutError: any, err: any, data?: any) => void - ) => { - data.created = true - callback(null, null, data) - } - - const errorCb = ( - _path: any, - _data: any, - _params: any, - callback: (timeoutError: any, err: any, _data?: any) => void - ) => { - callback(null, new Error(), null) - } - - const timeoutErrorCb = ( - _path: any, - _data: any, - _params: any, - callback: (timeoutError: any, err: any, _data?: any) => void - ) => { - callback(new Error(), null, null) - } - - connection.once('create', dataCb) - - let res = await service.create(testData) - - assert.ok(res.created) - - connection.once('create', errorCb) - - try { - res = await service.create(testData) - assert.fail('should not reach') - } catch (e) { - assert.ok(e instanceof Error) - } - - connection.once('create', timeoutErrorCb) - - try { - res = await service.create(testData) - assert.fail('should not reach') - } catch (e) { - assert.ok(e instanceof Error) - } - }) -}) diff --git a/packages/transport-commons/test/routing/index.test.ts b/packages/transport-commons/test/routing/index.test.ts deleted file mode 100644 index 0149262d2d..0000000000 --- a/packages/transport-commons/test/routing/index.test.ts +++ /dev/null @@ -1,128 +0,0 @@ -/* eslint-disable @typescript-eslint/ban-ts-comment */ -import assert from 'assert' -import { feathers, Application } from '@feathersjs/feathers' -import { routing } from '../../src/routing' - -describe('app.routes', () => { - let app: Application - - beforeEach(() => { - app = feathers().configure(routing()) - - app.use('/my/service', { - get(id: string | number) { - return Promise.resolve({ id }) - } - }) - }) - - 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) - }) - - it('returns null when nothing is found', () => { - const result = app.lookup('me/service') - - assert.strictEqual(result, null) - }) - - it('returns null for invalid service path', () => { - assert.strictEqual(app.lookup(null), null) - // @ts-ignore - assert.strictEqual(app.lookup({}), null) - }) - - it('can look up and strips slashes', () => { - const result = app.lookup('my/service') - - assert.strictEqual(result.service, app.service('/my/service/')) - }) - - it('can look up case insensitive', () => { - app.routes.caseSensitive = false - - const result = app.lookup('/My/ServicE') - - assert.strictEqual(result.service, app.service('my/service')) - }) - - it('can look up with id', () => { - const result = app.lookup('/my/service/1234') - - assert.strictEqual(result.service, app.service('/my/service')) - assert.deepStrictEqual(result.params, { - __id: '1234' - }) - }) - - it('can look up with params, id and special characters', () => { - const path = '/test/:first/my/:second' - - app.use(path, { - async get(id: string | number) { - return { id } - } - }) - - const result = app.lookup('/test/me/my/::special/testing') - - assert.strictEqual(result.service, app.service(path)) - assert.deepStrictEqual(result.params, { - __id: 'testing', - first: 'me', - second: '::special' - }) - }) - - it('can register routes with preset params', () => { - app.routes.insert('/my/service/:__id/preset', { - service: app.service('/my/service'), - params: { preset: true } - }) - - const result = app.lookup('/my/service/1234/preset') - - assert.strictEqual(result.service, app.service('/my/service')) - assert.deepStrictEqual(result.params, { - preset: true, - __id: '1234' - }) - }) - - it('can pass route params during a service registration', () => { - app.use( - '/other/service', - { - async get(id: any) { - return id - } - }, - { - routeParams: { used: true } - } - ) - - const result = app.lookup('/other/service/1234') - - assert.strictEqual(result.service, app.service('/other/service')) - assert.deepStrictEqual(result.params, { - used: true, - __id: '1234' - }) - }) - - it('can unregister a service (#2035)', async () => { - const result = app.lookup('my/service') - - assert.strictEqual(result.service, app.service('/my/service/')) - - await app.unuse('/my/service') - - assert.strictEqual(app.lookup('my/service'), null) - }) -}) diff --git a/packages/transport-commons/test/routing/router.test.ts b/packages/transport-commons/test/routing/router.test.ts deleted file mode 100644 index e451bba23d..0000000000 --- a/packages/transport-commons/test/routing/router.test.ts +++ /dev/null @@ -1,139 +0,0 @@ -import assert from 'assert' -import { Router } from '../../src/routing' - -describe('router', () => { - it('can lookup and insert a simple path and returns null for invalid path', () => { - const r = new Router() - - r.insert('/hello/there/you', 'test') - - const result = r.lookup('hello/there/you/') - - assert.deepStrictEqual(result, { - params: {}, - data: 'test' - }) - - assert.strictEqual(r.lookup('not/there'), null) - assert.strictEqual(r.lookup('not-me'), null) - }) - - it('can insert data at the root', () => { - const r = new Router() - - r.insert('', 'hi') - - const result = r.lookup('/') - - assert.deepStrictEqual(result, { - params: {}, - data: 'hi' - }) - }) - - it('can insert with placeholder and has proper specificity', () => { - const r = new Router() - - r.insert('/hello/:id', 'one') - r.insert('/hello/:id/you', 'two') - r.insert('/hello/:id/:other', 'three') - - const first = r.lookup('hello/there/') - - assert.throws(() => r.insert('/hello/:id/you', 'two'), { - message: 'Path hello/:id/you already exists' - }) - - assert.deepStrictEqual(first, { - params: { id: 'there' }, - data: 'one' - }) - - const second = r.lookup('hello/yes/you') - - assert.deepStrictEqual(second, { - params: { id: 'yes' }, - data: 'two' - }) - - const third = r.lookup('hello/yes/they') - - assert.deepStrictEqual(third, { - params: { - id: 'yes', - other: 'they' - }, - data: 'three' - }) - - assert.strictEqual(r.lookup('hello/yes/they/here'), null) - }) - - it('works with different placeholders in different paths (#2327)', () => { - const r = new Router() - - r.insert('/hello/:id', 'one') - r.insert('/hello/:test/you', 'two') - r.insert('/hello/:test/:two/hi/:three', 'three') - r.insert('/hello/:test/:two/hi', 'four') - - assert.deepStrictEqual(r.lookup('/hello/there'), { - params: { id: 'there' }, - data: 'one' - }) - assert.deepStrictEqual(r.lookup('/hello/there/you'), { - params: { test: 'there' }, - data: 'two' - }) - assert.strictEqual(r.lookup('/hello/there/bla'), null) - assert.deepStrictEqual(r.lookup('/hello/there/maybe/hi'), { - params: { test: 'there', two: 'maybe' }, - data: 'four' - }) - assert.deepStrictEqual(r.lookup('/hello/there/maybe/hi/test'), { - params: { three: 'test', two: 'maybe', test: 'there' }, - data: 'three' - }) - }) - - it('can remove paths (#2035)', () => { - const r = new Router() - - r.insert('/hello/:id', 'one') - r.insert('/hello/:test/you', 'two') - r.insert('/hello/here/thing', 'else') - - assert.deepStrictEqual(r.lookup('hello/there'), { params: { id: 'there' }, data: 'one' }) - - r.remove('/hello/:id') - - assert.deepStrictEqual(r.lookup('hello/here/you'), { params: { test: 'here' }, data: 'two' }) - assert.deepStrictEqual(r.lookup('hello/here/thing'), { params: {}, data: 'else' }) - assert.strictEqual(r.lookup('hello/there'), null) - - r.remove('/hello/:test/you') - assert.deepStrictEqual(r.lookup('hello/here/you'), null) - assert.deepStrictEqual(r.lookup('hello/here/thing'), { params: {}, data: 'else' }) - - r.remove('/hello/here/thing') - assert.ok(!r.root.hasChildren) - }) - - it('re-initialize a service with children. (#3432)', () => { - const r = new Router() - - r.insert('/hello', 'one') - r.insert('/hello/world', 'else') - - assert.deepStrictEqual(r.lookup('hello'), { params: {}, data: 'one' }) - - r.remove('/hello') - - assert.deepStrictEqual(r.lookup('hello/world'), { params: {}, data: 'else' }) - - r.insert('/hello', 'two') - - assert.deepStrictEqual(r.lookup('hello'), { params: {}, data: 'two' }) - assert.deepStrictEqual(r.lookup('hello/world'), { params: {}, data: 'else' }) - }) -}) diff --git a/packages/transport-commons/test/socket/index.test.ts b/packages/transport-commons/test/socket/index.test.ts deleted file mode 100644 index 48aacb85b1..0000000000 --- a/packages/transport-commons/test/socket/index.test.ts +++ /dev/null @@ -1,193 +0,0 @@ -import assert from 'assert' -import { EventEmitter } from 'events' -import { feathers, Application, Id, Params } from '@feathersjs/feathers' - -import { socket as commons, SocketOptions } from '../../src/socket' - -class DummyService { - async get(id: Id, params: Params) { - return { id, params } - } - - async create(data: any, params: Params) { - return { - ...data, - params - } - } - - async custom(data: any, params: Params) { - return { - ...data, - params, - message: 'From custom method' - } - } -} - -describe('@feathersjs/transport-commons', () => { - let provider: EventEmitter - let options: SocketOptions - let app: Application - let connection: any - - beforeEach(() => { - connection = { testing: true } - provider = new EventEmitter() - - options = { - emit: 'emit', - done: Promise.resolve(provider), - socketMap: new WeakMap(), - getParams() { - return connection - } - } - app = feathers() - .configure(commons(options)) - .use('/myservice', new DummyService(), { - methods: ['get', 'create', 'custom'] - }) - - return options.done - }) - - it('`connection` event', (done) => { - const socket = new EventEmitter() - - app.once('connection', (data) => { - assert.strictEqual(connection, data) - done() - }) - - provider.emit('connection', socket) - }) - - describe('method name based socket events', () => { - it('.get without params', (done) => { - const socket = new EventEmitter() - - provider.emit('connection', socket) - - socket.emit('get', 'myservice', 10, (error: any, result: any) => { - try { - assert.ok(!error) - assert.deepStrictEqual(result, { - id: 10, - params: Object.assign( - { - query: {}, - route: {}, - connection - }, - connection - ) - }) - done() - } catch (e: any) { - done(e) - } - }) - }) - - it('method with invalid service name and arguments', (done) => { - const socket = new EventEmitter() - - provider.emit('connection', socket) - - socket.emit('get', null, (error: any) => { - assert.strictEqual(error.name, 'NotFound') - assert.strictEqual(error.message, 'Invalid service path') - done() - }) - }) - - it('method with implicit toString errors properly', (done) => { - const socket = new EventEmitter() - - provider.emit('connection', socket) - - socket.emit('get', { toString: '' }, (error: any) => { - assert.strictEqual(error.name, 'NotFound') - assert.strictEqual(error.message, 'Invalid service path') - done() - }) - }) - - it('.create with params', (done) => { - const socket = new EventEmitter() - const data = { - test: 'data' - } - - provider.emit('connection', socket) - - socket.emit( - 'create', - 'myservice', - data, - { - fromQuery: true - }, - (error: any, result: any) => { - try { - const params = Object.assign( - { - query: { fromQuery: true }, - route: {}, - connection - }, - connection - ) - - assert.ok(!error) - assert.deepStrictEqual(result, Object.assign({ params }, data)) - done() - } catch (e: any) { - done(e) - } - } - ) - }) - - it('custom method with params', (done) => { - const socket = new EventEmitter() - const data = { - test: 'data' - } - - provider.emit('connection', socket) - - socket.emit( - 'custom', - 'myservice', - data, - { - fromQuery: true - }, - (error: any, result: any) => { - try { - const params = Object.assign( - { - query: { fromQuery: true }, - route: {}, - connection - }, - connection - ) - - assert.ok(!error) - assert.deepStrictEqual(result, { - ...data, - params, - message: 'From custom method' - }) - done() - } catch (e: any) { - done(e) - } - } - ) - }) - }) -}) diff --git a/packages/transport-commons/test/socket/utils.test.ts b/packages/transport-commons/test/socket/utils.test.ts deleted file mode 100644 index 8463d6698f..0000000000 --- a/packages/transport-commons/test/socket/utils.test.ts +++ /dev/null @@ -1,398 +0,0 @@ -import assert from 'assert' -import { EventEmitter } from 'events' -import { feathers, Application, Params, RealTimeConnection } from '@feathersjs/feathers' -import { NotAuthenticated } from '@feathersjs/errors' -import isPlainObject from 'lodash/isPlainObject' - -import { routing } from '../../src/routing' -import { normalizeError, getDispatcher, runMethod } from '../../src/socket/utils' - -describe('socket commons utils', () => { - describe('.normalizeError', () => { - it('simple error normalization', () => { - const message = 'Something went wrong' - const e = new Error(message) - - assert.deepStrictEqual(normalizeError(e), { - message, - stack: e.stack.toString() - }) - }) - - it('calls .toJSON', () => { - const json = { message: 'toJSON called' } - - assert.deepStrictEqual( - normalizeError({ - toJSON() { - return json - } - }), - json - ) - }) - - it('removes `hook` property', () => { - const e = { - hook: true - } - - assert.deepStrictEqual(normalizeError(e), {}) - assert.ok(e.hook, 'Does not mutate the original object') - }) - - it('hides stack in production', () => { - const oldEnv = process.env.NODE_ENV - - process.env.NODE_ENV = 'production' - - const message = 'Something went wrong' - const e = new Error(message) - const normalized = normalizeError(e) - - assert.strictEqual(normalized.message, message) - assert.ok(!normalized.stack) - - process.env.NODE_ENV = oldEnv - }) - }) - - describe('.getDispatcher', () => { - it('returns a dispatcher function', () => - assert.strictEqual(typeof getDispatcher('test', new WeakMap()), 'function')) - - it('works with backwards compatible socketKey', (done) => { - const socketKey = Symbol('@feathersjs/test') - const dispatcher = getDispatcher('emit', undefined, socketKey) - const socket = new EventEmitter() - const connection = { - [socketKey]: socket - } - const channel: any = { - connections: [connection], - dataFor(): null { - return null - } - } - - socket.once('testing', (data) => { - assert.strictEqual(data, 'hi') - done() - }) - - dispatcher('testing', channel, { result: 'hi' } as any) - }) - - describe('dispatcher logic', () => { - let dispatcher: any - let dummySocket: EventEmitter - let dummyHook: any - let dummyChannel: any - let dummyConnection: RealTimeConnection - let dummyMap: WeakMap - - beforeEach(() => { - dummyConnection = {} - dummyMap = new WeakMap() - dispatcher = getDispatcher('emit', dummyMap) - dummySocket = new EventEmitter() - dummyHook = { result: 'hi' } - dummyChannel = { - connections: [dummyConnection], - dataFor(): null { - return null - } - } - dummyMap.set(dummyConnection, dummySocket) - }) - - it('dispatches a basic event', (done) => { - dummySocket.once('testing', (data) => { - assert.strictEqual(data, 'hi') - done() - }) - - dispatcher('testing', dummyChannel, dummyHook) - }) - - it('dispatches event on a hooks path event', (done) => { - dummyHook.path = 'myservice' - - dummySocket.once('myservice testing', (data) => { - assert.strictEqual(data, 'hi') - done() - }) - - dispatcher('testing', dummyChannel, dummyHook) - }) - - it('dispatches `hook.dispatch` instead', (done) => { - const message = 'hi from dispatch' - - dummyHook.dispatch = message - - dummySocket.once('testing', (data) => { - assert.strictEqual(data, message) - done() - }) - - dispatcher('testing', dummyChannel, dummyHook) - }) - - it('does nothing if there is no socket', () => { - dummyChannel.connections[0].test = null - - dispatcher('testing', dummyChannel, dummyHook) - }) - - it('dispatches arrays properly hook events', (done) => { - const data1 = { message: 'First message' } - const data2 = { message: 'Second message' } - - dummyHook.result = [data1, data2] - - dummySocket.once('testing', (data) => { - assert.deepStrictEqual(data, data1) - dummySocket.once('testing', (result) => { - assert.deepStrictEqual(result, data2) - done() - }) - }) - - dispatcher('testing', dummyChannel, dummyHook, data1) - dispatcher('testing', dummyChannel, dummyHook, data2) - }) - - it('dispatches dispatch arrays properly', (done) => { - const data1 = { message: 'First message' } - const data2 = { message: 'Second message' } - - dummyHook.result = [] - dummyHook.dispatch = [data1, data2] - - dummySocket.once('testing', (data) => { - assert.deepStrictEqual(data, data1) - dummySocket.once('testing', (result) => { - assert.deepStrictEqual(result, data2) - done() - }) - }) - - dispatcher('testing', dummyChannel, dummyHook, data1) - dispatcher('testing', dummyChannel, dummyHook, data2) - }) - - it('dispatches arrays properly for custom events', (done) => { - const result = [{ message: 'First' }, { message: 'Second' }] - - dummyHook.result = result - - dummySocket.once('otherEvent', (data) => { - assert.deepStrictEqual(data, result) - done() - }) - - dispatcher('otherEvent', dummyChannel, dummyHook, result) - }) - }) - }) - - describe('.runMethod', () => { - let app: Application - - beforeEach(() => { - app = feathers().configure(routing()) - app.use('/myservice', { - async get(id: number | string, params: Params) { - if (params.query.error) { - throw new NotAuthenticated('None shall pass') - } - if (!isPlainObject(params.query)) { - throw new Error('Query is not a plain object') - } - - return { id } - } - }) - }) - - describe('running methods', () => { - it('basic', (done) => { - const callback = (error: any, result: any) => { - if (error) { - return done(error) - } - - assert.deepStrictEqual(result, { id: 10 }) - done() - } - - runMethod(app, {}, 'myservice', 'get', [10, {}, callback]) - }) - - it('queries are always plain objects', (done) => { - const callback = (error: any, result: any) => { - if (error) { - return done(error) - } - - assert.deepStrictEqual(result, { id: 10 }) - done() - } - - runMethod(app, {}, 'myservice', 'get', [ - 10, - { - __proto__: [] - }, - callback - ]) - }) - - it('merges params with connection and passes connection', (done) => { - const connection = { - testing: true - } - const callback = (error: any, result: any) => { - if (error) { - return done(error) - } - - assert.deepStrictEqual(result, { - id: 10, - params: { - connection, - query: {}, - route: {}, - testing: true - } - }) - done() - } - - app.use('/otherservice', { - get(id, params) { - return Promise.resolve({ id, params }) - } - }) - - runMethod(app, connection, 'otherservice', 'get', [10, {}, callback]) - }) - - it('with params missing', (done) => { - const callback = (error: any, result: any) => { - if (error) { - return done(error) - } - - assert.deepStrictEqual(result, { id: 10 }) - done() - } - - runMethod(app, {}, 'myservice', 'get', [10, callback]) - }) - - it('with params but missing callback', (done) => { - app.use('/otherservice', { - get(id: number | string) { - assert.strictEqual(id, 'dishes') - - return Promise.resolve({ id }).then((res) => { - done() - return res - }) - } - }) - - runMethod(app, {}, 'otherservice', 'get', ['dishes', {}]) - }) - - it('with params and callback missing', (done) => { - app.use('/otherservice', { - get(id: number | string) { - assert.strictEqual(id, 'laundry') - - return Promise.resolve({ id }).then((res) => { - done() - return res - }) - } - }) - - runMethod(app, {}, 'otherservice', 'get', ['laundry']) - }) - }) - - it('throws NotFound for invalid service', (done) => { - const callback = (error: any) => { - try { - assert.deepStrictEqual(error, { - name: 'NotFound', - message: "Service 'ohmyservice' not found", - code: 404, - className: 'not-found' - }) - done() - } catch (e: any) { - done(e) - } - } - - runMethod(app, {}, 'ohmyservice', 'get', [10, callback]) - }) - - it('throws MethodNotAllowed undefined method', (done) => { - const callback = (error: any) => { - try { - assert.deepStrictEqual(error, { - name: 'MethodNotAllowed', - message: "Method 'create' not allowed on service 'myservice'", - code: 405, - className: 'method-not-allowed' - }) - done() - } catch (e: any) { - done(e) - } - } - - runMethod(app, {}, 'myservice', 'create', [{}, callback]) - }) - - it('throws MethodNotAllowed for invalid service method', (done) => { - const callback = (error: any) => { - try { - assert.deepStrictEqual(error, { - name: 'MethodNotAllowed', - message: "Method 'blabla' not allowed on service 'myservice'", - code: 405, - className: 'method-not-allowed' - }) - done() - } catch (e: any) { - done(e) - } - } - - runMethod(app, {}, 'myservice', 'blabla', [{}, callback]) - }) - - it('method error calls back with normalized error', (done) => { - const callback = (error: any) => { - try { - assert.deepStrictEqual(error, { - name: 'NotAuthenticated', - message: 'None shall pass', - code: 401, - className: 'not-authenticated' - }) - done() - } catch (e: any) { - done(e) - } - } - - runMethod(app, {}, 'myservice', 'get', [42, { error: true }, callback]) - }) - }) -}) diff --git a/packages/transport-commons/tsconfig.json b/packages/transport-commons/tsconfig.json deleted file mode 100644 index 316fd41336..0000000000 --- a/packages/transport-commons/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig", - "include": [ - "src/**/*.ts" - ], - "compilerOptions": { - "outDir": "lib" - } -} diff --git a/packages/typebox/CHANGELOG.md b/packages/typebox/CHANGELOG.md deleted file mode 100644 index f2f8ee6cdf..0000000000 --- a/packages/typebox/CHANGELOG.md +++ /dev/null @@ -1,224 +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.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/typebox - -## [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/typebox - -## [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/typebox - -## [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/typebox - -## [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/typebox - -## [5.0.26](https://github.com/feathersjs/feathers/compare/v5.0.25...v5.0.26) (2024-06-09) - -### Bug Fixes - -- **typebox:** Add TRecord to getValidator arg1 type ([#3488](https://github.com/feathersjs/feathers/issues/3488)) ([ffbcc0a](https://github.com/feathersjs/feathers/commit/ffbcc0ad0c361f77171f9ad6224006727644433a)) - -## [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/typebox - -## [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/typebox - -## [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/typebox - -## [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/typebox - -## [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/typebox - -## [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/typebox - -## [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/typebox - -## [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/typebox - -## [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/typebox - -## [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/typebox - -## [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/typebox - -## [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/typebox - -## [5.0.12](https://github.com/feathersjs/feathers/compare/v5.0.11...v5.0.12) (2023-11-28) - -### Bug Fixes - -- **schema:** Allow $in and $nin queries to work for arrays ([#3352](https://github.com/feathersjs/feathers/issues/3352)) ([677c214](https://github.com/feathersjs/feathers/commit/677c214a353a7f9a1f90649b9bbec4d0d6517a6f)) - -## [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) - -### Bug Fixes - -- **typebox:** Allow default value in StringEnum ([#3281](https://github.com/feathersjs/feathers/issues/3281)) ([25af09a](https://github.com/feathersjs/feathers/commit/25af09ad065e72768bf88bc8b529b68f2ca4da17)) - -## [5.0.9](https://github.com/feathersjs/feathers/compare/v5.0.8...v5.0.9) (2023-09-27) - -### Bug Fixes - -- **typebox:** allow TUnion inside getValidator ([#3262](https://github.com/feathersjs/feathers/issues/3262)) ([cf9df96](https://github.com/feathersjs/feathers/commit/cf9df96c1011fcf13e9c6d652b06036bb0aac1c3)) - -## [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/typebox - -## [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/typebox - -## [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/typebox - -## [5.0.5](https://github.com/feathersjs/feathers/compare/v5.0.4...v5.0.5) (2023-04-28) - -### Bug Fixes - -- **typebox:** Revert to TypeBox 0.25 ([#3183](https://github.com/feathersjs/feathers/issues/3183)) ([cacedf5](https://github.com/feathersjs/feathers/commit/cacedf59e3d2df836777f0cd06ab1b2484ed87c5)) - -## [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)) -- **typebox:** Implement custom TypeBuilder for backwards compatibility ([#3150](https://github.com/feathersjs/feathers/issues/3150)) ([962bd87](https://github.com/feathersjs/feathers/commit/962bd87217212320b1a68f6556a16b8a6b8f757c)) - -## [5.0.3](https://github.com/feathersjs/feathers/compare/v5.0.2...v5.0.3) (2023-04-05) - -### Bug Fixes - -- **authentication:** Ensure authentication.entity configuration can be null ([#3136](https://github.com/feathersjs/feathers/issues/3136)) ([c47349b](https://github.com/feathersjs/feathers/commit/c47349b9dcf2067b7b572c5463b15b2a8fbda972)) -- **dependencies:** Update all dependencies ([#3139](https://github.com/feathersjs/feathers/issues/3139)) ([f24276e](https://github.com/feathersjs/feathers/commit/f24276e9a909e2e58a0730c730258ce1f70f4028)) -- **knex:** Get by id and transactions should work with params.knex ([#3146](https://github.com/feathersjs/feathers/issues/3146)) ([b172b5e](https://github.com/feathersjs/feathers/commit/b172b5ea9b461642874eb7d2ba01dc4cfc275155)) -- **typebox:** Upgrade to TypeBox 0.26.0 ([#3113](https://github.com/feathersjs/feathers/issues/3113)) ([d1d9598](https://github.com/feathersjs/feathers/commit/d1d95984dd94d2b9305e7338421f84f9c4f733fd)) - -## [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/typebox - -# [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/typebox - -# [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 - -- **schema:** Add schema helper for handling Object ids ([#3058](https://github.com/feathersjs/feathers/issues/3058)) ([1393bed](https://github.com/feathersjs/feathers/commit/1393bed81a9ee814de6aab0e537af83e667591a2)) - -# [5.0.0-pre.37](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.36...v5.0.0-pre.37) (2023-02-09) - -### Bug Fixes - -- **typebox:** Allow nested or in and queries ([#3029](https://github.com/feathersjs/feathers/issues/3029)) ([39e0b78](https://github.com/feathersjs/feathers/commit/39e0b785238b809aa9b4dea9b95efc3c188c9baa)) - -# [5.0.0-pre.36](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.35...v5.0.0-pre.36) (2023-01-29) - -### Bug Fixes - -- **configuration:** Add pool and connection object to SQL database default configuration ([#3023](https://github.com/feathersjs/feathers/issues/3023)) ([092c749](https://github.com/feathersjs/feathers/commit/092c749d43f7da4d019576d1210fe7d3719a44a2)) -- **schema:** Fix TypeBox extension value query syntax inference ([#3010](https://github.com/feathersjs/feathers/issues/3010)) ([f1c7a76](https://github.com/feathersjs/feathers/commit/f1c7a76586bbb8aed66ef866c3dcd666d79f3a24)) -- Update all dependencies ([#3024](https://github.com/feathersjs/feathers/issues/3024)) ([283dc47](https://github.com/feathersjs/feathers/commit/283dc4798d85584bc031e6e54b83b4ea77d1edd0)) - -# [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)) -- **schema:** Allow to add additional operators to the query syntax ([#2941](https://github.com/feathersjs/feathers/issues/2941)) ([f324940](https://github.com/feathersjs/feathers/commit/f324940d5795b41e8c6fc113defb0beb7ab03a0a)) - -# [5.0.0-pre.34](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.33...v5.0.0-pre.34) (2022-12-14) - -### Bug Fixes - -- **schema:** Allow query schemas with no properties, error on unsupported types ([#2904](https://github.com/feathersjs/feathers/issues/2904)) ([b66c734](https://github.com/feathersjs/feathers/commit/b66c734357478f51b2d38fa7f3eee08640cea26e)) -- **typebox:** Improve query syntax defaults ([#2888](https://github.com/feathersjs/feathers/issues/2888)) ([59f3cdc](https://github.com/feathersjs/feathers/commit/59f3cdca6376e34fe39a7b91db837d0325aeb5db)) - -# [5.0.0-pre.33](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.32...v5.0.0-pre.33) (2022-11-08) - -### Features - -- **schema:** Add StringEnum to TypeBox module ([#2827](https://github.com/feathersjs/feathers/issues/2827)) ([65d3665](https://github.com/feathersjs/feathers/commit/65d36656f50a48f633fa3fcabaea10521d04bf1c)) - -# [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/typebox - -# [5.0.0-pre.31](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.30...v5.0.0-pre.31) (2022-10-12) - -### Features - -- **cli:** Improve generated schema definitions ([#2783](https://github.com/feathersjs/feathers/issues/2783)) ([474a9fd](https://github.com/feathersjs/feathers/commit/474a9fda2107e9bcf357746320a8e00cda8182b6)) - -# [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 - -- **schema:** Make schemas validation library independent and add TypeBox support ([#2772](https://github.com/feathersjs/feathers/issues/2772)) ([44172d9](https://github.com/feathersjs/feathers/commit/44172d99b566d11d9ceda04f1d0bf72b6d05ce76)) diff --git a/packages/typebox/LICENSE b/packages/typebox/LICENSE deleted file mode 100644 index 7839c824d7..0000000000 --- a/packages/typebox/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2024 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 -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -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/typebox/README.md b/packages/typebox/README.md deleted file mode 100644 index b1b3db74f6..0000000000 --- a/packages/typebox/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# @feathersjs/typebox - -[![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/typebox.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/typebox) -[![Discord](https://badgen.net/badge/icon/discord?icon=discord&label)](https://discord.gg/qa8kez8QBx) - -> [TypeBox](https://github.com/sinclairzx81/typebox) integration for @feathersjs/schema - -## Installation - -``` -npm install @feathersjs/typebox --save -``` - -## Documentation - -Refer to the [Feathers TypeBox documentation](https://feathersjs.com/api/schema/typebox.html) 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/typebox/package.json b/packages/typebox/package.json deleted file mode 100644 index 4e032afaf1..0000000000 --- a/packages/typebox/package.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "name": "@feathersjs/typebox", - "description": "TypeBox integration for @feathersjs/schema", - "version": "5.0.34", - "homepage": "https://feathersjs.com", - "main": "lib/", - "types": "lib/", - "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", - "directory": "packages/schema" - }, - "author": { - "name": "Feathers contributors", - "email": "hello@feathersjs.com", - "url": "https://feathersjs.com" - }, - "contributors": [], - "bugs": { - "url": "https://github.com/feathersjs/feathers/issues" - }, - "engines": { - "node": ">= 12" - }, - "files": [ - "CHANGELOG.md", - "LICENSE", - "README.md", - "src/**", - "lib/**", - "*.d.ts", - "*.js" - ], - "scripts": { - "prepublish": "npm run compile", - "pack": "npm pack --pack-destination ../generators/test/build", - "compile": "shx rm -rf lib/ && tsc && npm run pack", - "mocha": "mocha --config ../../.mocharc.json --recursive test/**.test.ts test/**/*.test.ts", - "test": "npm run compile && npm run mocha" - }, - "directories": { - "lib": "lib" - }, - "publishConfig": { - "access": "public" - }, - "dependencies": { - "@feathersjs/schema": "^5.0.34", - "@sinclair/typebox": "^0.25.0" - }, - "devDependencies": { - "@types/mocha": "^10.0.10", - "@types/node": "^24.1.0", - "mocha": "^11.7.1", - "shx": "^0.4.0", - "typescript": "^5.9.2" - }, - "gitHead": "90caf635aec850550b9d37bea2762af959d9e8d5" -} diff --git a/packages/typebox/src/default-schemas.ts b/packages/typebox/src/default-schemas.ts deleted file mode 100644 index e9fae9167a..0000000000 --- a/packages/typebox/src/default-schemas.ts +++ /dev/null @@ -1,109 +0,0 @@ -import { Type, Static } from '@sinclair/typebox' - -export const authenticationSettingsSchema = Type.Object({ - secret: Type.String({ description: 'The JWT signing secret' }), - entity: Type.Optional( - Type.Union([ - Type.String({ description: 'The name of the authentication entity (e.g. user)' }), - Type.Null() - ]) - ), - entityId: Type.Optional(Type.String({ description: 'The name of the authentication entity id property' })), - service: Type.Optional(Type.String({ description: 'The path of the entity service' })), - authStrategies: Type.Array(Type.String(), { - description: 'A list of authentication strategy names that are allowed to create JWT access tokens' - }), - parseStrategies: Type.Optional( - Type.Array(Type.String(), { - description: - 'A list of authentication strategy names that should parse HTTP headers for authentication information (defaults to `authStrategies`)' - }) - ), - jwtOptions: Type.Optional(Type.Object({})), - jwt: Type.Optional( - Type.Object({ - header: Type.String({ default: 'Authorization', description: 'The HTTP header containing the JWT' }), - schemes: Type.String({ description: 'An array of schemes to support' }) - }) - ), - local: Type.Optional( - Type.Object({ - usernameField: Type.String({ description: 'Name of the username field (e.g. `email`)' }), - passwordField: Type.String({ description: 'Name of the password field (e.g. `password`)' }), - hashSize: Type.Optional(Type.Number({ description: 'The BCrypt salt length' })), - errorMessage: Type.Optional(Type.String({ description: 'The error message to return on errors' })), - entityUsernameField: Type.Optional( - Type.String({ - description: - 'Name of the username field on the entity if authentication request data and entity field names are different' - }) - ), - entityPasswordField: Type.Optional( - Type.String({ - description: - 'Name of the password field on the entity if authentication request data and entity field names are different' - }) - ) - }) - ), - oauth: Type.Optional( - Type.Object({ - redirect: Type.Optional(Type.String()), - origins: Type.Optional(Type.Array(Type.String())), - defaults: Type.Optional( - Type.Object({ - key: Type.Optional(Type.String()), - secret: Type.Optional(Type.String()) - }) - ) - }) - ) -}) - -export const sqlSettingsSchema = Type.Optional( - Type.Object({ - client: Type.String(), - connection: Type.Union([ - Type.String(), - Type.Partial( - Type.Object({ - host: Type.String(), - port: Type.Number(), - user: Type.String(), - password: Type.String(), - database: Type.String() - }) - ) - ]), - pool: Type.Optional( - Type.Object({ - min: Type.Number(), - max: Type.Number() - }) - ) - }) -) - -export const defaultAppConfiguration = Type.Object( - { - authentication: Type.Optional(authenticationSettingsSchema), - paginate: Type.Optional( - Type.Object( - { - default: Type.Number(), - max: Type.Number() - }, - { additionalProperties: false } - ) - ), - origins: Type.Optional(Type.Array(Type.String())), - mongodb: Type.Optional(Type.String()), - mysql: sqlSettingsSchema, - postgresql: sqlSettingsSchema, - sqlite: sqlSettingsSchema, - mssql: sqlSettingsSchema - }, - { $id: 'ApplicationConfiguration', additionalProperties: false } -) - -export type DefaultAppConfiguration = Static diff --git a/packages/typebox/src/index.ts b/packages/typebox/src/index.ts deleted file mode 100644 index 098cf22a90..0000000000 --- a/packages/typebox/src/index.ts +++ /dev/null @@ -1,201 +0,0 @@ -import { - Type, - TObject, - TInteger, - TOptional, - TSchema, - ObjectOptions, - TIntersect, - TUnion, - type TRecord -} from '@sinclair/typebox' -import { jsonSchema, Validator, DataValidatorMap, Ajv } from '@feathersjs/schema' - -export * from '@sinclair/typebox' -export * from './default-schemas' - -export type TDataSchemaMap = { - create: TObject - update?: TObject - patch?: TObject -} - -/** - * Returns a compiled validation function for a TypeBox object and AJV validator instance. - * - * @param schema The JSON schema definition - * @param validator The AJV validation instance - * @returns A compiled validation function - */ -export const getValidator = ( - schema: TObject | TIntersect | TUnion | TRecord, - validator: Ajv -): Validator => jsonSchema.getValidator(schema as any, validator) - -/** - * Returns compiled validation functions to validate data for the `create`, `update` and `patch` - * service methods. If not passed explicitly, the `update` validator will be the same as the `create` - * and `patch` will be the `create` validator with no required fields. - * - * @param def Either general TypeBox object definition or a mapping of `create`, `update` and `patch` - * to their respective type object - * @param validator The Ajv instance to use as the validator - * @returns A map of validator functions - */ -export const getDataValidator = (def: TObject | TDataSchemaMap, validator: Ajv): DataValidatorMap => - jsonSchema.getDataValidator(def as any, validator) - -/** - * 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 }) -} - -const arrayOfKeys = (type: T) => { - const keys = Object.keys(type.properties) - return Type.Unsafe<(keyof T['properties'])[]>({ - type: 'array', - maxItems: keys.length, - items: { - type: 'string', - ...(keys.length > 0 ? { enum: keys } : {}) - } - }) -} - -/** - * Creates the `$sort` Feathers query syntax schema for an object schema - * - * @param schema 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 }) -} - -/** - * Returns the standard Feathers query syntax for a property schema, - * including operators like `$gt`, `$lt` etc. for a single property - * - * @param def The property definition - * @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 } - ) - ) - ]) - ) - -type QueryProperty = ReturnType< - typeof queryProperty -> - -/** - * Creates a Feathers query syntax schema for the properties defined in `definition`. - * - * @param definition The properties to create the Feathers query syntax schema for - * @param extensions Additional properties to add to a property query - * @returns The Feathers query syntax schema - */ -export const queryProperties = < - T extends TObject, - X extends { [K in keyof T['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]) - - return result - }, - {} as { [K in keyof T['properties']]: QueryProperty } - ) - - return Type.Optional(Type.Object(properties, { additionalProperties: false })) -} - -/** - * 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 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: T, - extensions: X = {} as X, - options: ObjectOptions = { additionalProperties: false } -) => { - 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 - ], - options - ) -} - -export const ObjectIdSchema = () => - 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 deleted file mode 100644 index bfb82718db..0000000000 --- a/packages/typebox/test/index.test.ts +++ /dev/null @@ -1,152 +0,0 @@ -import assert from 'assert' -import { ObjectId as MongoObjectId } from 'mongodb' -import { Ajv } from '@feathersjs/schema' -import { - querySyntax, - Type, - Static, - defaultAppConfiguration, - getDataValidator, - getValidator, - ObjectIdSchema -} from '../src' - -describe('@feathersjs/schema/typebox', () => { - describe('querySyntax', () => { - it('basics', async () => { - const schema = Type.Object({ - name: Type.String(), - age: Type.Number() - }) - const querySchema = querySyntax(schema) - - type Query = Static - - const query: Query = { - name: 'Dave', - age: { $gt: 42, $in: [50, 51] }, - $select: ['age', 'name'], - $sort: { - age: 1 - } - } - - const validator = new Ajv().compile(querySchema) - let validated = (await validator(query)) as any as Query - - assert.ok(validated) - - validated = (await validator({ ...query, something: 'wrong' })) as any as Query - assert.ok(!validated) - }) - - it('querySyntax works with no properties', async () => { - const schema = querySyntax(Type.Object({})) - - new Ajv().compile(schema) - }) - - it('query syntax can include additional extensions', async () => { - const schema = Type.Object({ - name: Type.String(), - age: Type.Number() - }) - const querySchema = querySyntax(schema, { - age: { - $notNull: Type.Boolean() - }, - name: { - $ilike: Type.String() - } - }) - const validator = new Ajv().compile(querySchema) - - type Query = Static - - const query: Query = { - age: { - $gt: 10, - $notNull: true - }, - name: { - $gt: 'David', - $ilike: 'Dave' - } - } - - const validated = (await validator(query)) as any as Query - - assert.ok(validated) - }) - }) - - 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 validator = new Ajv().compile(configSchema) - const validated = await validator({ - host: 'something', - port: 3030, - public: './' - }) - - assert.ok(validated) - }) - - // Test ObjectId validation - it('ObjectId', async () => { - const schema = Type.Object({ - _id: ObjectIdSchema() - }) - - const validator = new Ajv({ - strict: false - }).compile(schema) - const validated = await validator({ - _id: '507f191e810c19729de860ea' - }) - assert.ok(validated) - - const validated2 = await validator({ - _id: new MongoObjectId() - }) - assert.ok(validated2) - }) - - it('validators', () => { - assert.strictEqual(typeof getDataValidator(Type.Object({}), new Ajv()), 'object') - assert.strictEqual(typeof getValidator(Type.Object({}), new Ajv()), 'function') - assert.strictEqual( - typeof getValidator(Type.Intersect([Type.Object({}), Type.Object({})]), new Ajv()), - 'function' - ) - }) -}) diff --git a/packages/typebox/tsconfig.json b/packages/typebox/tsconfig.json deleted file mode 100644 index 316fd41336..0000000000 --- a/packages/typebox/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "../../tsconfig", - "include": [ - "src/**/*.ts" - ], - "compilerOptions": { - "outDir": "lib" - } -} diff --git a/tsconfig.json b/tsconfig.json index 3144d1beb1..9f2b9ea6a2 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,12 +3,10 @@ // 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'. */ - // "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'. */ + "target": "ES2020", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */ + "module": "ESNext", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ + "moduleResolution": "bundler", /* Specify module resolution strategy */ + /* ... rest of the configuration remains the same ... */ "declaration": true, /* Generates corresponding '.d.ts' file. */ // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ "sourceMap": true, /* Generates corresponding '.map' file. */ @@ -37,7 +35,6 @@ // "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). */ // "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. */ diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 0000000000..bb1690ad3b --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,13 @@ +import { defineConfig } from 'vitest/config' + +export default defineConfig({ + test: { + include: ['packages/**/src/**/*.{test,spec}.{js,ts,tsx,jsx}'], + coverage: { + provider: 'v8', + include: ['packages/*/src/**/*.{js,ts,tsx,jsx}'], + exclude: ['**/*.test.{js,ts,tsx,jsx}', '**/*.spec.{js,ts,tsx,jsx}', '**/node_modules/**', '**/lib/**', '**/dist/**', '**/*.d.ts', '**/fixtures/**'], + reporter: ['text', 'html', 'lcov'] + } + } +})